diff --git a/README.md b/README.md index 45b2280..e05c876 100644 --- a/README.md +++ b/README.md @@ -113,8 +113,8 @@ Follow these steps to set up a Taqueria project: 1. Install the `ligo/fa` library, which provides templates for creating FA2 tokens: ```bash - echo '{ "name": "app", "dependencies": { "@ligo/fa": "^1.0.9" } }' >> ligo.json - TAQ_LIGO_IMAGE=ligolang/ligo:1.1.0 taq ligo --command "install @ligo/fa" + echo '{ "name": "app", "dependencies": { "@ligo/fa": "^1.1.1" } }' >> ligo.json + TAQ_LIGO_IMAGE=ligolang/ligo:1.3.0 taq ligo --command "install @ligo/fa" ``` This command can take some time because it downloads and installs the `@ligo/fa` package. @@ -328,7 +328,7 @@ The code also defines the type for the value that entrypoints return: a list of 1. Save the contract and compile it by running this command: ```bash - TAQ_LIGO_IMAGE=ligolang/ligo:1.1.0 taq compile nft.jsligo + TAQ_LIGO_IMAGE=ligolang/ligo:1.3.0 taq compile nft.jsligo ``` Taqueria compiles the contract to the file `artifacts/nft.tz`. @@ -384,7 +384,7 @@ The code also defines the type for the value that entrypoints return: a list of 1. Compile the contract: ```bash - TAQ_LIGO_IMAGE=ligolang/ligo:1.1.0 taq compile nft.jsligo + TAQ_LIGO_IMAGE=ligolang/ligo:1.3.0 taq compile nft.jsligo ``` 1. Use one of these options to set up a Ghostnet account to use to deploy (originate) the contract: diff --git a/solution/.taq/state.json b/solution/.taq/state.json index b9c79f5..ee56a22 100644 --- a/solution/.taq/state.json +++ b/solution/.taq/state.json @@ -1,7 +1,7 @@ // WARNING: This file is autogenerated and should NOT be modified { "build": "0b37e42", - "configHash": "b8a9fefadba3d671471400307dddb7aef919ef9d64b4e03580b53550a980d928", + "configHash": "be3e18e596ca1de92147260bd11ceb666f4939638568ce8b6f76c1ba86156bc6", "tasks": { "ligo": { "type": "npm", @@ -89,7 +89,7 @@ "version": "0.1", "schema": "1.0", "alias": "ligo", - "postInstall": "node /home/zamrokk/training-nft-1/nft-marketplace/node_modules/@taqueria/lib-ligo/postinstall.js", + "postInstall": "node /home/zamrokk/training-nft-1/solution/node_modules/@taqueria/lib-ligo/postinstall.js", "tasks": [ { "task": "ligo", diff --git a/solution/.taq/testing-state.json b/solution/.taq/testing-state.json index 6d697bd..f754129 100644 --- a/solution/.taq/testing-state.json +++ b/solution/.taq/testing-state.json @@ -26,6 +26,18 @@ "alias": "nft" } ] + }, + "@taqueria/plugin-taquito.deploy.1699872896612": { + "task": "deploy", + "plugin": "@taqueria/plugin-taquito", + "time": 1699872896612, + "output": [ + { + "contract": "nft.tz", + "address": "KT1PBkqvCfSFaoSztuLd5AEGtWFhhEqMD81V", + "alias": "nft" + } + ] } } } \ No newline at end of file diff --git a/solution_extension/.gitignore b/solution_extension/.gitignore new file mode 100644 index 0000000..5c584c3 --- /dev/null +++ b/solution_extension/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +artifacts +.taq/*-state.json +.taq/config.local.*.json +node_modules/ \ No newline at end of file diff --git a/solution_extension/.ligo/repository_id b/solution_extension/.ligo/repository_id new file mode 100644 index 0000000..2f4b39c --- /dev/null +++ b/solution_extension/.ligo/repository_id @@ -0,0 +1 @@ +8273581c-4ea5-460e-2f17-d458f3504157 \ No newline at end of file diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/LICENSE b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/LICENSE new file mode 100644 index 0000000..3a88240 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-2023 the LigoLang team. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/Makefile b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/Makefile new file mode 100644 index 0000000..8a59d38 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/Makefile @@ -0,0 +1,65 @@ +SHELL := /bin/bash + +ligo_compiler?=docker run --rm -v "$(PWD)":"$(PWD)" -w "$(PWD)" ligolang/ligo:1.2.0 +# ^ Override this variable when you run make command by make ligo_compiler= +# ^ Otherwise use default one (you'll need docker) +PROTOCOL_OPT?= + +project_root=--project-root . +# ^ required when using packages + +help: + @grep -E '^[ a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \ + awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' + +compile = $(ligo_compiler) compile contract $(project_root) ./lib/$(1) -o ./compiled/$(2) $(3) $(PROTOCOL_OPT) +# ^ compile contract to michelson or micheline + +test = $(ligo_compiler) run test $(project_root) ./test/$(1) $(PROTOCOL_OPT) +# ^ run given test file + +compile: ## compile contracts + @if [ ! -d ./compiled ]; then mkdir -p ./compiled/fa2/nft && mkdir -p ./compiled/fa2/asset ; fi + @echo "Compiling contracts..." + @$(call compile,fa2/nft/nft.impl.mligo,fa2/nft/nft.impl.mligo.tz) + @$(call compile,fa2/nft/nft.impl.mligo,fa2/nft/nft.impl.mligo.json,--michelson-format json) + @$(call compile,fa2/asset/single_asset.impl.mligo,fa2/asset/single_asset.impl.mligo.tz) + @$(call compile,fa2/asset/single_asset.impl.mligo,fa2/asset/single_asset.impl.mligo.json,--michelson-format json) + @$(call compile,fa2/asset/multi_asset.impl.mligo,fa2/asset/multi_asset.impl.mligo.tz) + @$(call compile,fa2/asset/multi_asset.impl.mligo,fa2/asset/multi_asset.impl.mligo.json,--michelson-format json) + @echo "Compiled contracts!" +clean: ## clean up + @rm -rf compiled + +deploy: deploy_deps deploy.js + +deploy.js: + @echo "Running deploy script\n" + @cd deploy && npm i && npm start + +deploy_deps: + @echo "Installing deploy script dependencies" + @cd deploy && npm install + @echo "" + +install: ## install dependencies + @$(ligo_compiler) install + +.PHONY: test +test: ## run tests (SUITE=permit make test) +ifndef SUITE + @$(call test,fa2/single_asset.test.mligo) + @$(call test,fa2/single_asset_jsligo.test.mligo) + @$(call test,fa2/multi_asset.test.mligo) + @$(call test,fa2/nft/nft.test.mligo) + @$(call test,fa2/multi_asset_jsligo.test.mligo) + @$(call test,fa2/nft/nft_jsligo.test.mligo) + @$(call test,fa2/nft/views.test.mligo) + +## @$(call test,fa2/nft/e2e_mutation.test.mligo) +else + @$(call test,$(SUITE).test.mligo) +endif + +lint: ## lint code + @npx eslint ./scripts --ext .ts diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/README.md b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/README.md new file mode 100644 index 0000000..f1085e8 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/README.md @@ -0,0 +1,160 @@ +# FA2 tokens + +`ligo/fa` library provides : + +- the [interface](./lib/fa2/common/tzip12.interfaces.jsligo) and [types](./lib/fa2/common/tzip12.datatypes.jsligo) defined by [FA2 (TZIP-12)](https://tzip.tezosagora.org/proposal/tzip-12/) +- a [LIGO](https://ligolang.org/) implementation for : + - unique [NFTs](./lib/fa2/nft/nft.impl.jsligo): This contract implements the FA2 interface for + NFT(non-fungible-token) where a token can belong to only one address at a time + (1:1) + - [Single Assets](./lib/fa2/asset/single_asset.impl.mligo): This is an implementation of + Single Asset Token where a different amount of single token can belong to multiple + addresses at a time (1:n) + - [Multiple Assets](./lib/fa2/asset/multi_asset.impl.mligo): This is an implementation of + Multi Asset Token where there are several token ids (available in different amounts) + and they can belong to multiple addresses (m:n) + +## Use the implementation directly + +The library provides you 3 template implementations ready to deploy + +1. To install this package, run `ligo install @ligo/fa`. It will download the files +1. Deploy the NFT contract with Taquito the Ghostnet with `alice` wallet + +```bash +make compile +make deploy +``` + +## Extend an implementation + +If you need additional features in your contract, you can use the extendable version. An example is +available in the file `examples/mintable.mligo`. Using the extension mechanism, it adds an admin +address to the storage, as well as a `mint` entrypoint to mint owner-less NFTs. Only the admin can +call this entrypoint. + +Install the library and create a new file + +```bash +ligo install @ligo/fa +touch mintable.mligo +``` + +To extend the storage, define the type of the extension and refer to the original storage type as +such: + +```ocaml +#import "@ligo/fa/lib/main.mligo" "FA2" + +module NFT = FA2.NFTExtendable + +type extension = { + admin: address +} + +type storage = extension NFT.storage +type ret = operation list * storage +``` + +Importing the library allows you to refer to the TZIP12 operations signatures and make it easier to +redefine all the entrypoints and views that are required: + +```ocaml +(* Standard FA2 interface, copied from the source *) + +[@entry] +let transfer (t: NFT.TZIP12.transfer) (s: storage) : ret = + NFT.transfer t s + +[@entry] +let balance_of (b: NFT.TZIP12.balance_of) (s: storage) : ret = + NFT.balance_of b s + +(* Etc. *) +``` + +To make it easier to define new entrypoints, some functions are available in the library, and you +can also use the `storage` fields directly: + +```ocaml +(* Extension *) + +type mint = { + owner : address; + token_id : nat; +} + +[@entry] +let mint (mint : mint) (s : storage): ret = + let sender = Tezos.get_sender () in + let () = assert (sender = s.extension.admin) in + let () = NFT.Assertions.assert_token_exist s.token_metadata mint.token_id in + (* Check that nobody owns the token already *) + let () = assert (Option.is_none (Big_map.find_opt mint.token_id s.ledger)) in + let s = NFT.set_balance s mint.owner mint.token_id in + [], s +``` + +Note that this version requires the minted NFTs to be already defined in the `token_metadata` big +map. However, you can also change the `mint` entrypoint to create new tokens dynamically. + +## Implement the interface differently + +If you are not happy with the default NFT implementation, you can define your own + +Create a new file + +```bash +touch myTzip12NFTImplementation.jsligo +``` + +Import some code and define implementation of missing types `ledger` and `operators` + +```ligolang +#import "@ligo/fa/lib/fa2/common/errors.mligo" "Errors" + +#import "@ligo/fa/lib/fa2/common/assertions.jsligo" "Assertions" + +#import "@ligo/fa/lib/fa2/common/tzip12.datatypes.jsligo" "TZIP12" + +#import "@ligo/fa/lib/fa2/common/tzip12.interfaces.jsligo" "TZIP12Interface" + +#import "@ligo/fa/lib/fa2/common/tzip16.datatypes.jsligo" "TZIP16" + +export namespace NFT implements TZIP12Interface.FA2{ + export type ledger = big_map; + type operator = address; + export type operators = big_map<[address, operator], set>; + export type storage = { + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata + }; + type ret = [list, storage]; + +} +``` + +Copy the missing entrypoints from the TZIP12 interface and give your own implementation + +```ligolang + @entry + const transfer = (p: TZIP12.transfer, s: storage): ret => { + failwith("TODO"); + }; + @entry + const balance_of = (p: TZIP12.balance_of, s: storage): ret => { + failwith("TODO"); + }; + @entry + const update_operators = (p: TZIP12.update_operators, s: storage): ret => { + failwith("TODO"); + }; +``` + +Compile it (do not forget to add the parameter -m NFT as you have to define a namespace to be able to implement an interface) + +```bash +ligo compile contract myTzip12NFTImplementation.jsligo -m NFT +``` diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/multi_asset.impl.mligo.json b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/multi_asset.impl.mligo.json new file mode 100644 index 0000000..6d8af37 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/multi_asset.impl.mligo.json @@ -0,0 +1,2 @@ +[{"prim":"parameter","args":[{"prim":"or","args":[{"prim":"list","args":[{"prim":"or","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%add_operator"]},{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%remove_operator"]}]}],"annots":["%update_operators"]},{"prim":"or","args":[{"prim":"pair","args":[{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}]}],"annots":["%requests"]},{"prim":"contract","args":[{"prim":"list","args":[{"prim":"pair","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%request"]},{"prim":"nat","annots":["%balance"]}]}]}],"annots":["%callback"]}],"annots":["%balance_of"]},{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%from_"]},{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%to_"]},{"prim":"nat","annots":["%token_id"]},{"prim":"nat","annots":["%amount"]}]}],"annots":["%txs"]}]}],"annots":["%transfer"]}]}]}]},{"prim":"storage","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"}],"annots":["%ledger"]},{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"address"}]},{"prim":"set","args":[{"prim":"nat"}]}],"annots":["%operators"]},{"prim":"big_map","args":[{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat","annots":["%token_id"]},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%token_info"]}]}],"annots":["%token_metadata"]},{"prim":"big_map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%metadata"]},{"prim":"unit","annots":["%extension"]}]}]},{"prim":"code","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"LAMBDA","args":[{"prim":"address"},{"prim":"unit"},[{"prim":"PUSH","args":[{"prim":"string"},{"string":"The sender can only manage operators for his own token"}]},{"prim":"SENDER"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"UNIT"}],[{"prim":"FAILWITH"}]]}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"}]},{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"},[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DUG","args":[{"int":"2"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]}],[]]}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"}]},{"prim":"address"},{"prim":"nat"},{"prim":"nat"}]},{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"}]},[{"prim":"UNPAIR","args":[{"int":"4"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"UPDATE"}]]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"UNPAIR"},{"prim":"IF_LEFT","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"5"}]},{"prim":"DROP","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"ITER","args":[[{"prim":"IF_LEFT","args":[[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP","args":[{"int":"3"}]}],[{"prim":"DUP"},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"True"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"UPDATE"}]]}],[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP","args":[{"int":"3"}]}],[{"prim":"DUP"},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"nat"}]}]}],[{"prim":"DIG","args":[{"int":"4"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"False"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"SIZE"},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"nat"}]}]}],[{"prim":"SOME"}]]}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"UPDATE"}]]}]]}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"NIL","args":[{"prim":"operation"}]}],[{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP"},{"prim":"IF_LEFT","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"UNPAIR"},{"prim":"MAP","args":[[{"prim":"DUP"},{"prim":"UNPAIR"},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"DUP","args":[{"int":"7"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"CAR"},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"SWAP"},{"prim":"PAIR"}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"SWAP"},{"prim":"PUSH","args":[{"prim":"mutez"},{"int":"0"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"TRANSFER_TOKENS"},{"prim":"SWAP"},{"prim":"NIL","args":[{"prim":"operation"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"CONS"}],[{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"SWAP"},{"prim":"ITER","args":[[{"prim":"UNPAIR"},{"prim":"DUG","args":[{"int":"2"}]},{"prim":"ITER","args":[[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"DUP","args":[{"int":"9"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"SENDER"},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"}],[{"prim":"DUP","args":[{"int":"7"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"MEM"},{"prim":"IF","args":[[],[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_NOT_OPERATOR"}]},{"prim":"FAILWITH"}]]}]]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"9"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"GE"},{"prim":"IF","args":[[],[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_INSUFFICIENT_BALANCE"}]},{"prim":"FAILWITH"}]]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"SWAP"},{"prim":"SUB"},{"prim":"ABS"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"DIG","args":[{"int":"6"}]},{"prim":"PAIR","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"9"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"ADD"},{"prim":"DUG","args":[{"int":"3"}]},{"prim":"PAIR","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"SWAP"},{"prim":"EXEC"}]]},{"prim":"SWAP"},{"prim":"DROP"}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP","args":[{"int":"3"}]},{"prim":"UPDATE","args":[{"int":"1"}]},{"prim":"NIL","args":[{"prim":"operation"}]}]]}]]},{"prim":"PAIR"}]]},{"prim":"view","args":[{"string":"get_balance"},{"prim":"pair","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"},[{"prim":"UNPAIR"},{"prim":"UNPAIR"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"DUG","args":[{"int":"2"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]}],[]]}]]},{"prim":"view","args":[{"string":"total_supply"},{"prim":"nat"},{"prim":"nat"},[{"prim":"DROP"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"Feature not available. Maybe use an indexer instead"}]},{"prim":"FAILWITH"}]]},{"prim":"view","args":[{"string":"all_tokens"},{"prim":"unit"},{"prim":"set","args":[{"prim":"nat"}]},[{"prim":"DROP"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"Feature not available. Maybe use an indexer instead"}]},{"prim":"FAILWITH"}]]},{"prim":"view","args":[{"string":"is_operator"},{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}]},{"prim":"bool"},[{"prim":"UNPAIR"},{"prim":"DUP"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"CAR"},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"SIZE"},{"prim":"COMPARE"},{"prim":"GT"},{"prim":"OR"}]]},{"prim":"view","args":[{"string":"token_metadata"},{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat","annots":["%token_id"]},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%token_info"]}]},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"GET","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[]]}]]}] + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/multi_asset.impl.mligo.tz b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/multi_asset.impl.mligo.tz new file mode 100644 index 0000000..ff6aa83 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/multi_asset.impl.mligo.tz @@ -0,0 +1,276 @@ +{ parameter + (or (list %update_operators + (or (pair %add_operator (address %owner) (address %operator) (nat %token_id)) + (pair %remove_operator (address %owner) (address %operator) (nat %token_id)))) + (or (pair %balance_of + (list %requests (pair (address %owner) (nat %token_id))) + (contract %callback + (list (pair (pair %request (address %owner) (nat %token_id)) (nat %balance))))) + (list %transfer + (pair (address %from_) (list %txs (pair (address %to_) (nat %token_id) (nat %amount))))))) ; + storage + (pair (big_map %ledger (pair address nat) nat) + (big_map %operators (pair address address) (set nat)) + (big_map %token_metadata nat (pair (nat %token_id) (map %token_info string bytes))) + (big_map %metadata string bytes) + (unit %extension)) ; + code { PUSH string "FA2_TOKEN_UNDEFINED" ; + LAMBDA + address + unit + { PUSH string "The sender can only manage operators for his own token" ; + SENDER ; + DIG 2 ; + COMPARE ; + EQ ; + IF { DROP ; UNIT } { FAILWITH } } ; + LAMBDA + (pair (big_map (pair address nat) nat) address nat) + nat + { UNPAIR 3 ; DUG 2 ; PAIR ; GET ; IF_NONE { PUSH nat 0 } {} } ; + LAMBDA + (pair (big_map (pair address nat) nat) address nat nat) + (big_map (pair address nat) nat) + { UNPAIR 4 ; DIG 3 ; SOME ; DIG 3 ; DIG 3 ; PAIR ; UPDATE } ; + DIG 4 ; + UNPAIR ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DIG 5 ; + DROP 3 ; + DUP 2 ; + GET 3 ; + SWAP ; + ITER { IF_LEFT + { UNPAIR 3 ; + DUP 2 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP 3 } + { DUP ; + DUP 7 ; + SWAP ; + EXEC ; + DROP ; + DUP 4 ; + DIG 4 ; + DUP 4 ; + DUP 4 ; + PAIR ; + GET ; + IF_NONE { EMPTY_SET nat } {} ; + DIG 4 ; + PUSH bool True ; + SWAP ; + UPDATE ; + SOME ; + DIG 3 ; + DIG 3 ; + PAIR ; + UPDATE } } + { UNPAIR 3 ; + DUP 2 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP 3 } + { DUP ; + DUP 7 ; + SWAP ; + EXEC ; + DROP ; + DUP 4 ; + DIG 4 ; + DUP 4 ; + DUP 4 ; + PAIR ; + GET ; + IF_NONE + { DIG 3 ; DROP ; NONE (set nat) } + { DIG 4 ; + PUSH bool False ; + SWAP ; + UPDATE ; + PUSH nat 0 ; + DUP 2 ; + SIZE ; + COMPARE ; + EQ ; + IF { DROP ; NONE (set nat) } { SOME } } ; + DIG 3 ; + DIG 3 ; + PAIR ; + UPDATE } } } ; + DIG 2 ; + DROP ; + UPDATE 3 ; + NIL operation } + { DIG 4 ; + DROP ; + IF_LEFT + { DIG 2 ; + DROP ; + UNPAIR ; + MAP { DUP ; + UNPAIR ; + DUP 5 ; + GET 5 ; + DUP 3 ; + GET ; + IF_NONE { DUP 7 ; FAILWITH } { DROP } ; + DUP 5 ; + CAR ; + PAIR 3 ; + DUP 5 ; + SWAP ; + EXEC ; + SWAP ; + PAIR } ; + DIG 3 ; + DIG 4 ; + DROP 2 ; + SWAP ; + PUSH mutez 0 ; + DIG 2 ; + TRANSFER_TOKENS ; + SWAP ; + NIL operation ; + DIG 2 ; + CONS } + { DUP 2 ; + CAR ; + SWAP ; + ITER { UNPAIR ; + DUG 2 ; + ITER { UNPAIR 3 ; + DUP 6 ; + GET 5 ; + DUP 3 ; + GET ; + IF_NONE { DUP 9 ; FAILWITH } { DROP } ; + SENDER ; + DUP 6 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP } + { DUP 7 ; + GET 3 ; + SWAP ; + DUP 7 ; + PAIR ; + GET ; + IF_NONE { EMPTY_SET nat } {} ; + DUP 3 ; + MEM ; + IF {} { PUSH string "FA2_NOT_OPERATOR" ; FAILWITH } } ; + DUP 2 ; + DUP 6 ; + DUP 6 ; + PAIR 3 ; + DUP 9 ; + SWAP ; + EXEC ; + DUP 4 ; + DUP 2 ; + COMPARE ; + GE ; + IF {} { PUSH string "FA2_INSUFFICIENT_BALANCE" ; FAILWITH } ; + DUP 4 ; + SWAP ; + SUB ; + ABS ; + DUP 3 ; + DUP 7 ; + DIG 6 ; + PAIR 4 ; + DUP 7 ; + SWAP ; + EXEC ; + DUP 3 ; + DUP 3 ; + DUP 3 ; + PAIR 3 ; + DUP 9 ; + SWAP ; + EXEC ; + DIG 4 ; + ADD ; + DUG 3 ; + PAIR 4 ; + DUP 4 ; + SWAP ; + EXEC } ; + SWAP ; + DROP } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DROP 3 ; + UPDATE 1 ; + NIL operation } } ; + PAIR } ; + view "get_balance" + (pair address nat) + nat + { UNPAIR ; + UNPAIR ; + DUP 3 ; + GET 5 ; + DUP 3 ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } { DROP } ; + DIG 2 ; + CAR ; + DUG 2 ; + PAIR ; + GET ; + IF_NONE { PUSH nat 0 } {} } ; + view "total_supply" + nat + nat + { DROP ; + PUSH string "Feature not available. Maybe use an indexer instead" ; + FAILWITH } ; + view "all_tokens" + unit + (set nat) + { DROP ; + PUSH string "Feature not available. Maybe use an indexer instead" ; + FAILWITH } ; + view "is_operator" + (pair (address %owner) (address %operator) (nat %token_id)) + bool + { UNPAIR ; + DUP ; + GET 3 ; + DUP 2 ; + CAR ; + COMPARE ; + EQ ; + PUSH nat 0 ; + DIG 3 ; + GET 3 ; + DUP 4 ; + GET 3 ; + DIG 4 ; + CAR ; + PAIR ; + GET ; + IF_NONE { EMPTY_SET nat } {} ; + SIZE ; + COMPARE ; + GT ; + OR } ; + view "token_metadata" + nat + (pair (nat %token_id) (map %token_info string bytes)) + { UNPAIR ; + SWAP ; + GET 5 ; + SWAP ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } {} } } + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/single_asset.impl.mligo.json b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/single_asset.impl.mligo.json new file mode 100644 index 0000000..38d5570 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/single_asset.impl.mligo.json @@ -0,0 +1,2 @@ +[{"prim":"parameter","args":[{"prim":"or","args":[{"prim":"list","args":[{"prim":"or","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%add_operator"]},{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%remove_operator"]}]}],"annots":["%update_operators"]},{"prim":"or","args":[{"prim":"pair","args":[{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}]}],"annots":["%requests"]},{"prim":"contract","args":[{"prim":"list","args":[{"prim":"pair","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%request"]},{"prim":"nat","annots":["%balance"]}]}]}],"annots":["%callback"]}],"annots":["%balance_of"]},{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%from_"]},{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%to_"]},{"prim":"nat","annots":["%token_id"]},{"prim":"nat","annots":["%amount"]}]}],"annots":["%txs"]}]}],"annots":["%transfer"]}]}]}]},{"prim":"storage","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"address"},{"prim":"nat"}],"annots":["%ledger"]},{"prim":"big_map","args":[{"prim":"address"},{"prim":"set","args":[{"prim":"address"}]}],"annots":["%operators"]},{"prim":"big_map","args":[{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat","annots":["%token_id"]},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%token_info"]}]}],"annots":["%token_metadata"]},{"prim":"big_map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%metadata"]},{"prim":"unit","annots":["%extension"]}]}]},{"prim":"code","args":[[{"prim":"LAMBDA","args":[{"prim":"address"},{"prim":"unit"},[{"prim":"PUSH","args":[{"prim":"string"},{"string":"The sender can only manage operators for his own token"}]},{"prim":"SENDER"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"UNIT"}],[{"prim":"FAILWITH"}]]}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"address"}]},{"prim":"nat"},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]}],[]]}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"address"},{"prim":"nat"}]},{"prim":"big_map","args":[{"prim":"address"},{"prim":"nat"}]},[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"UPDATE"}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"UNPAIR"},{"prim":"IF_LEFT","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"ITER","args":[[{"prim":"IF_LEFT","args":[[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP","args":[{"int":"2"}]}],[{"prim":"DUP"},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"address"}]}],[]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"True"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"UPDATE"}]]}],[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP","args":[{"int":"2"}]}],[{"prim":"DUP"},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"address"}]}]}],[{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"False"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"SIZE"},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"address"}]}]}],[{"prim":"SOME"}]]}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"UPDATE"}]]}]]}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"NIL","args":[{"prim":"operation"}]}],[{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP"},{"prim":"IF_LEFT","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"UNPAIR"},{"prim":"MAP","args":[[{"prim":"DUP"},{"prim":"CAR"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"CAR"},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"SWAP"},{"prim":"PAIR"}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP"},{"prim":"SWAP"},{"prim":"PUSH","args":[{"prim":"mutez"},{"int":"0"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"TRANSFER_TOKENS"},{"prim":"SWAP"},{"prim":"NIL","args":[{"prim":"operation"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"CONS"}],[{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"SWAP"},{"prim":"ITER","args":[[{"prim":"UNPAIR"},{"prim":"DUG","args":[{"int":"2"}]},{"prim":"ITER","args":[[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"DROP"},{"prim":"SENDER"},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"}],[{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"address"}]}],[]]},{"prim":"SWAP"},{"prim":"MEM"},{"prim":"IF","args":[[],[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_NOT_OPERATOR"}]},{"prim":"FAILWITH"}]]}]]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"GE"},{"prim":"IF","args":[[],[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_INSUFFICIENT_BALANCE"}]},{"prim":"FAILWITH"}]]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"SUB"},{"prim":"ABS"},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"ADD"},{"prim":"DUG","args":[{"int":"2"}]},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"SWAP"},{"prim":"EXEC"}]]},{"prim":"SWAP"},{"prim":"DROP"}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"UPDATE","args":[{"int":"1"}]},{"prim":"NIL","args":[{"prim":"operation"}]}]]}]]},{"prim":"PAIR"}]]},{"prim":"view","args":[{"string":"get_balance"},{"prim":"pair","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"},[{"prim":"UNPAIR"},{"prim":"UNPAIR"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"SWAP"},{"prim":"CAR"},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]}],[]]}]]},{"prim":"view","args":[{"string":"total_supply"},{"prim":"nat"},{"prim":"nat"},[{"prim":"DROP"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"Feature not available. Maybe use an indexer instead"}]},{"prim":"FAILWITH"}]]},{"prim":"view","args":[{"string":"all_tokens"},{"prim":"unit"},{"prim":"set","args":[{"prim":"nat"}]},[{"prim":"DROP"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"Feature not available. Maybe use an indexer instead"}]},{"prim":"FAILWITH"}]]},{"prim":"view","args":[{"string":"is_operator"},{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}]},{"prim":"bool"},[{"prim":"UNPAIR"},{"prim":"DUP"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"CAR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"address"}]}],[]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"MEM"},{"prim":"OR"}]]},{"prim":"view","args":[{"string":"token_metadata"},{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat","annots":["%token_id"]},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%token_info"]}]},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"GET","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[]]}]]}] + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/single_asset.impl.mligo.tz b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/single_asset.impl.mligo.tz new file mode 100644 index 0000000..dc39b13 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/asset/single_asset.impl.mligo.tz @@ -0,0 +1,241 @@ +{ parameter + (or (list %update_operators + (or (pair %add_operator (address %owner) (address %operator) (nat %token_id)) + (pair %remove_operator (address %owner) (address %operator) (nat %token_id)))) + (or (pair %balance_of + (list %requests (pair (address %owner) (nat %token_id))) + (contract %callback + (list (pair (pair %request (address %owner) (nat %token_id)) (nat %balance))))) + (list %transfer + (pair (address %from_) (list %txs (pair (address %to_) (nat %token_id) (nat %amount))))))) ; + storage + (pair (big_map %ledger address nat) + (big_map %operators address (set address)) + (big_map %token_metadata nat (pair (nat %token_id) (map %token_info string bytes))) + (big_map %metadata string bytes) + (unit %extension)) ; + code { LAMBDA + address + unit + { PUSH string "The sender can only manage operators for his own token" ; + SENDER ; + DIG 2 ; + COMPARE ; + EQ ; + IF { DROP ; UNIT } { FAILWITH } } ; + LAMBDA + (pair (big_map address nat) address) + nat + { UNPAIR ; SWAP ; GET ; IF_NONE { PUSH nat 0 } {} } ; + LAMBDA + (pair (big_map address nat) address nat) + (big_map address nat) + { UNPAIR 3 ; DIG 2 ; SOME ; DIG 2 ; UPDATE } ; + DIG 3 ; + UNPAIR ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DROP 2 ; + DUP 2 ; + GET 3 ; + SWAP ; + ITER { IF_LEFT + { UNPAIR 3 ; + DIG 2 ; + DROP ; + DUP 2 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP 2 } + { DUP ; + DUP 6 ; + SWAP ; + EXEC ; + DROP ; + DUP 3 ; + DIG 3 ; + DUP 3 ; + GET ; + IF_NONE { EMPTY_SET address } {} ; + DIG 3 ; + PUSH bool True ; + SWAP ; + UPDATE ; + SOME ; + DIG 2 ; + UPDATE } } + { UNPAIR 3 ; + DIG 2 ; + DROP ; + DUP 2 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP 2 } + { DUP ; + DUP 6 ; + SWAP ; + EXEC ; + DROP ; + DUP 3 ; + DIG 3 ; + DUP 3 ; + GET ; + IF_NONE + { DIG 2 ; DROP ; NONE (set address) } + { DIG 3 ; + PUSH bool False ; + SWAP ; + UPDATE ; + PUSH nat 0 ; + DUP 2 ; + SIZE ; + COMPARE ; + EQ ; + IF { DROP ; NONE (set address) } { SOME } } ; + DIG 2 ; + UPDATE } } } ; + DIG 2 ; + DROP ; + UPDATE 3 ; + NIL operation } + { DIG 4 ; + DROP ; + IF_LEFT + { DIG 2 ; + DROP ; + UNPAIR ; + MAP { DUP ; CAR ; DUP 4 ; CAR ; PAIR ; DUP 5 ; SWAP ; EXEC ; SWAP ; PAIR } ; + DIG 3 ; + DROP ; + SWAP ; + PUSH mutez 0 ; + DIG 2 ; + TRANSFER_TOKENS ; + SWAP ; + NIL operation ; + DIG 2 ; + CONS } + { DUP 2 ; + CAR ; + SWAP ; + ITER { UNPAIR ; + DUG 2 ; + ITER { UNPAIR 3 ; + SWAP ; + DROP ; + SENDER ; + DUP 5 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP } + { DUP 6 ; + GET 3 ; + DUP 6 ; + GET ; + IF_NONE { EMPTY_SET address } {} ; + SWAP ; + MEM ; + IF {} { PUSH string "FA2_NOT_OPERATOR" ; FAILWITH } } ; + DUP 4 ; + DUP 4 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DUP 3 ; + DUP 2 ; + COMPARE ; + GE ; + IF {} { PUSH string "FA2_INSUFFICIENT_BALANCE" ; FAILWITH } ; + DUP 3 ; + SWAP ; + SUB ; + ABS ; + DUP 5 ; + DIG 4 ; + PAIR 3 ; + DUP 6 ; + SWAP ; + EXEC ; + DUP 2 ; + DUP 2 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DIG 3 ; + ADD ; + DUG 2 ; + PAIR 3 ; + DUP 4 ; + SWAP ; + EXEC } ; + SWAP ; + DROP } ; + DIG 2 ; + DIG 3 ; + DROP 2 ; + UPDATE 1 ; + NIL operation } } ; + PAIR } ; + view "get_balance" + (pair address nat) + nat + { UNPAIR ; + UNPAIR ; + DUP 3 ; + GET 5 ; + DIG 2 ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } { DROP } ; + SWAP ; + CAR ; + SWAP ; + GET ; + IF_NONE { PUSH nat 0 } {} } ; + view "total_supply" + nat + nat + { DROP ; + PUSH string "Feature not available. Maybe use an indexer instead" ; + FAILWITH } ; + view "all_tokens" + unit + (set nat) + { DROP ; + PUSH string "Feature not available. Maybe use an indexer instead" ; + FAILWITH } ; + view "is_operator" + (pair (address %owner) (address %operator) (nat %token_id)) + bool + { UNPAIR ; + DUP ; + GET 3 ; + DUP 2 ; + CAR ; + COMPARE ; + EQ ; + DIG 2 ; + GET 3 ; + DUP 3 ; + CAR ; + GET ; + IF_NONE { EMPTY_SET address } {} ; + DIG 2 ; + GET 3 ; + MEM ; + OR } ; + view "token_metadata" + nat + (pair (nat %token_id) (map %token_info string bytes)) + { UNPAIR ; + SWAP ; + GET 5 ; + SWAP ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } {} } } + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/nft/nft.impl.mligo.json b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/nft/nft.impl.mligo.json new file mode 100644 index 0000000..11ffbcd --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/nft/nft.impl.mligo.json @@ -0,0 +1,2 @@ +[{"prim":"parameter","args":[{"prim":"or","args":[{"prim":"list","args":[{"prim":"or","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%add_operator"]},{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%remove_operator"]}]}],"annots":["%update_operators"]},{"prim":"or","args":[{"prim":"pair","args":[{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}]}],"annots":["%requests"]},{"prim":"contract","args":[{"prim":"list","args":[{"prim":"pair","args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}],"annots":["%request"]},{"prim":"nat","annots":["%balance"]}]}]}],"annots":["%callback"]}],"annots":["%balance_of"]},{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%from_"]},{"prim":"list","args":[{"prim":"pair","args":[{"prim":"address","annots":["%to_"]},{"prim":"nat","annots":["%token_id"]},{"prim":"nat","annots":["%amount"]}]}],"annots":["%txs"]}]}],"annots":["%transfer"]}]}]}]},{"prim":"storage","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"nat"},{"prim":"address"}],"annots":["%ledger"]},{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"address"}]},{"prim":"set","args":[{"prim":"nat"}]}],"annots":["%operators"]},{"prim":"big_map","args":[{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat","annots":["%token_id"]},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%token_info"]}]}],"annots":["%token_metadata"]},{"prim":"big_map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%metadata"]},{"prim":"unit","annots":["%extension"]}]}]},{"prim":"code","args":[[{"prim":"LAMBDA","args":[{"prim":"address"},{"prim":"unit"},[{"prim":"PUSH","args":[{"prim":"string"},{"string":"The sender can only manage operators for his own token"}]},{"prim":"SENDER"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"UNIT"}],[{"prim":"FAILWITH"}]]}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat"},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}]}]}]},{"prim":"nat"}]},{"prim":"unit"},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"UNIT"}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"nat"},{"prim":"address"}]},{"prim":"nat"},{"prim":"address"}]},{"prim":"bool"},[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"option is None"}]},{"prim":"FAILWITH"}],[]]},{"prim":"COMPARE"},{"prim":"EQ"}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"UNPAIR"},{"prim":"IF_LEFT","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"ITER","args":[[{"prim":"IF_LEFT","args":[[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP","args":[{"int":"3"}]}],[{"prim":"DUP"},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"True"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"UPDATE"}]]}],[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP","args":[{"int":"3"}]}],[{"prim":"DUP"},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"nat"}]}]}],[{"prim":"DIG","args":[{"int":"4"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"False"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"SIZE"},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"nat"}]}]}],[{"prim":"SOME"}]]}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"UPDATE"}]]}]]}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"NIL","args":[{"prim":"operation"}]}],[{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP"},{"prim":"IF_LEFT","args":[[{"prim":"UNPAIR"},{"prim":"MAP","args":[[{"prim":"DUP"},{"prim":"UNPAIR"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"SWAP"},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"CAR"},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"IF","args":[[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"1"}]}],[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]}]]},{"prim":"SWAP"},{"prim":"PAIR"}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"SWAP"},{"prim":"PUSH","args":[{"prim":"mutez"},{"int":"0"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"TRANSFER_TOKENS"},{"prim":"SWAP"},{"prim":"NIL","args":[{"prim":"operation"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"CONS"}],[{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"SWAP"},{"prim":"ITER","args":[[{"prim":"UNPAIR"},{"prim":"DUG","args":[{"int":"2"}]},{"prim":"ITER","args":[[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"SENDER"},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"}],[{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"MEM"},{"prim":"IF","args":[[],[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_NOT_OPERATOR"}]},{"prim":"FAILWITH"}]]}]]},{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_INSUFFICIENT_BALANCE"}]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"IF","args":[[{"prim":"DROP"}],[{"prim":"FAILWITH"}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"SWAP"},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"UPDATE"}]]},{"prim":"SWAP"},{"prim":"DROP"}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"UPDATE","args":[{"int":"1"}]},{"prim":"NIL","args":[{"prim":"operation"}]}]]}]]},{"prim":"PAIR"}]]},{"prim":"view","args":[{"string":"get_balance"},{"prim":"pair","args":[{"prim":"address"},{"prim":"nat"}]},{"prim":"nat"},[{"prim":"UNPAIR"},{"prim":"UNPAIR"},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"option is None"}]},{"prim":"FAILWITH"}],[]]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"1"}]}],[{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]}]]}]]},{"prim":"view","args":[{"string":"total_supply"},{"prim":"nat"},{"prim":"nat"},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"GET","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"1"}]}]]},{"prim":"view","args":[{"string":"all_tokens"},{"prim":"unit"},{"prim":"set","args":[{"prim":"nat"}]},[{"prim":"DROP"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"Feature not available. Maybe use an indexer instead"}]},{"prim":"FAILWITH"}]]},{"prim":"view","args":[{"string":"is_operator"},{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}]},{"prim":"bool"},[{"prim":"UNPAIR"},{"prim":"DUP"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"CAR"},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"SIZE"},{"prim":"COMPARE"},{"prim":"GT"},{"prim":"OR"}]]},{"prim":"view","args":[{"string":"token_metadata"},{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat","annots":["%token_id"]},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}],"annots":["%token_info"]}]},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"GET","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[]]}]]}] + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/nft/nft.impl.mligo.tz b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/nft/nft.impl.mligo.tz new file mode 100644 index 0000000..f95c4e6 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/compiled/fa2/nft/nft.impl.mligo.tz @@ -0,0 +1,273 @@ +{ parameter + (or (list %update_operators + (or (pair %add_operator (address %owner) (address %operator) (nat %token_id)) + (pair %remove_operator (address %owner) (address %operator) (nat %token_id)))) + (or (pair %balance_of + (list %requests (pair (address %owner) (nat %token_id))) + (contract %callback + (list (pair (pair %request (address %owner) (nat %token_id)) (nat %balance))))) + (list %transfer + (pair (address %from_) (list %txs (pair (address %to_) (nat %token_id) (nat %amount))))))) ; + storage + (pair (big_map %ledger nat address) + (big_map %operators (pair address address) (set nat)) + (big_map %token_metadata nat (pair (nat %token_id) (map %token_info string bytes))) + (big_map %metadata string bytes) + (unit %extension)) ; + code { LAMBDA + address + unit + { PUSH string "The sender can only manage operators for his own token" ; + SENDER ; + DIG 2 ; + COMPARE ; + EQ ; + IF { DROP ; UNIT } { FAILWITH } } ; + LAMBDA + (pair (big_map nat (pair nat (map string bytes))) nat) + unit + { UNPAIR ; + SWAP ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } { DROP } ; + UNIT } ; + LAMBDA + (pair (big_map nat address) nat address) + bool + { UNPAIR 3 ; + SWAP ; + GET ; + IF_NONE { PUSH string "option is None" ; FAILWITH } {} ; + COMPARE ; + EQ } ; + DIG 3 ; + UNPAIR ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DROP 2 ; + DUP 2 ; + GET 3 ; + SWAP ; + ITER { IF_LEFT + { UNPAIR 3 ; + DUP 2 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP 3 } + { DUP ; + DUP 7 ; + SWAP ; + EXEC ; + DROP ; + DUP 4 ; + DIG 4 ; + DUP 4 ; + DUP 4 ; + PAIR ; + GET ; + IF_NONE { EMPTY_SET nat } {} ; + DIG 4 ; + PUSH bool True ; + SWAP ; + UPDATE ; + SOME ; + DIG 3 ; + DIG 3 ; + PAIR ; + UPDATE } } + { UNPAIR 3 ; + DUP 2 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP 3 } + { DUP ; + DUP 7 ; + SWAP ; + EXEC ; + DROP ; + DUP 4 ; + DIG 4 ; + DUP 4 ; + DUP 4 ; + PAIR ; + GET ; + IF_NONE + { DIG 3 ; DROP ; NONE (set nat) } + { DIG 4 ; + PUSH bool False ; + SWAP ; + UPDATE ; + PUSH nat 0 ; + DUP 2 ; + SIZE ; + COMPARE ; + EQ ; + IF { DROP ; NONE (set nat) } { SOME } } ; + DIG 3 ; + DIG 3 ; + PAIR ; + UPDATE } } } ; + DIG 2 ; + DROP ; + UPDATE 3 ; + NIL operation } + { DIG 4 ; + DROP ; + IF_LEFT + { UNPAIR ; + MAP { DUP ; + UNPAIR ; + DUP 2 ; + DUP 6 ; + GET 5 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DROP ; + SWAP ; + DUP 5 ; + CAR ; + PAIR 3 ; + DUP 5 ; + SWAP ; + EXEC ; + IF { PUSH nat 1 } { PUSH nat 0 } ; + SWAP ; + PAIR } ; + DIG 3 ; + DIG 4 ; + DROP 2 ; + SWAP ; + PUSH mutez 0 ; + DIG 2 ; + TRANSFER_TOKENS ; + SWAP ; + NIL operation ; + DIG 2 ; + CONS } + { DUP 2 ; + CAR ; + SWAP ; + ITER { UNPAIR ; + DUG 2 ; + ITER { UNPAIR 3 ; + DIG 2 ; + DROP ; + DUP 2 ; + DUP 6 ; + GET 5 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DROP ; + SENDER ; + DUP 5 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP } + { DUP 6 ; + GET 3 ; + SWAP ; + DUP 6 ; + PAIR ; + GET ; + IF_NONE { EMPTY_SET nat } {} ; + DUP 3 ; + MEM ; + IF {} { PUSH string "FA2_NOT_OPERATOR" ; FAILWITH } } ; + PUSH string "FA2_INSUFFICIENT_BALANCE" ; + DUP 5 ; + DUP 4 ; + DUP 6 ; + PAIR 3 ; + DUP 8 ; + SWAP ; + EXEC ; + IF { DROP } { FAILWITH } ; + DIG 2 ; + SWAP ; + SOME ; + DIG 2 ; + UPDATE } ; + SWAP ; + DROP } ; + DIG 2 ; + DIG 3 ; + DROP 2 ; + UPDATE 1 ; + NIL operation } } ; + PAIR } ; + view "get_balance" + (pair address nat) + nat + { UNPAIR ; + UNPAIR ; + DUP 3 ; + GET 5 ; + DUP 3 ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } { DROP } ; + DIG 2 ; + CAR ; + DIG 2 ; + GET ; + IF_NONE { PUSH string "option is None" ; FAILWITH } {} ; + COMPARE ; + EQ ; + IF { PUSH nat 1 } { PUSH nat 0 } } ; + view "total_supply" + nat + nat + { UNPAIR ; + SWAP ; + GET 5 ; + SWAP ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } { DROP } ; + PUSH nat 1 } ; + view "all_tokens" + unit + (set nat) + { DROP ; + PUSH string "Feature not available. Maybe use an indexer instead" ; + FAILWITH } ; + view "is_operator" + (pair (address %owner) (address %operator) (nat %token_id)) + bool + { UNPAIR ; + DUP ; + GET 3 ; + DUP 2 ; + CAR ; + COMPARE ; + EQ ; + PUSH nat 0 ; + DIG 3 ; + GET 3 ; + DUP 4 ; + GET 3 ; + DIG 4 ; + CAR ; + PAIR ; + GET ; + IF_NONE { EMPTY_SET nat } {} ; + SIZE ; + COMPARE ; + GT ; + OR } ; + view "token_metadata" + nat + (pair (nat %token_id) (map %token_info string bytes)) + { UNPAIR ; + SWAP ; + GET 5 ; + SWAP ; + GET ; + IF_NONE { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } {} } } + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/index.js b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/index.js new file mode 100644 index 0000000..cca31dd --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/index.js @@ -0,0 +1,72 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const signer_1 = require("@taquito/signer"); +const taquito_1 = require("@taquito/taquito"); +const utils_1 = require("@taquito/utils"); +const nft_impl_mligo_json_1 = __importDefault(require("../compiled/fa2/nft/nft.impl.mligo.json")); +const RPC_ENDPOINT = "https://ghostnet.tezos.marigold.dev"; +function main() { + return __awaiter(this, void 0, void 0, function* () { + const Tezos = new taquito_1.TezosToolkit(RPC_ENDPOINT); + //set alice key + Tezos.setProvider({ + signer: yield signer_1.InMemorySigner.fromSecretKey("edskRpm2mUhvoUjHjXgMoDRxMKhtKfww1ixmWiHCWhHuMEEbGzdnz8Ks4vgarKDtxok7HmrEo1JzkXkdkvyw7Rtw6BNtSd7MJ7"), + }); + const ledger = new taquito_1.MichelsonMap(); + ledger.set(0, "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb"); + const token_metadata = new taquito_1.MichelsonMap(); + const token_info = new taquito_1.MichelsonMap(); + token_info.set("name", (0, utils_1.char2Bytes)("My super token")); + token_info.set("description", (0, utils_1.char2Bytes)("Lorem ipsum ...")); + token_info.set("symbol", (0, utils_1.char2Bytes)("XXX")); + token_info.set("decimals", (0, utils_1.char2Bytes)("0")); + token_metadata.set(0, { token_id: 0, token_info }); + const metadata = new taquito_1.MichelsonMap(); + metadata.set("", (0, utils_1.char2Bytes)("tezos-storage:data")); + metadata.set("data", (0, utils_1.char2Bytes)(`{ + "name":"FA2", + "description":"Example FA2 implementation", + "version":"0.1.0", + "license":{"name":"MIT"}, + "authors":["Benjamin Fuentes"], + "homepage":"", + "source":{"tools":["Ligo"], "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors":[], + "views":[] + + }`)); + const operators = new taquito_1.MichelsonMap(); + const initialStorage = { + ledger, + metadata, + token_metadata, + operators, + }; + try { + const originated = yield Tezos.contract.originate({ + code: nft_impl_mligo_json_1.default, + storage: initialStorage, + }); + console.log(`Waiting for nftContract ${originated.contractAddress} to be confirmed...`); + yield originated.confirmation(2); + console.log("confirmed contract: ", originated.contractAddress); + } + catch (error) { + console.log(error); + } + }); +} +main(); diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/index.ts b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/index.ts new file mode 100644 index 0000000..2ebe17e --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/index.ts @@ -0,0 +1,74 @@ +import { InMemorySigner } from "@taquito/signer"; +import { MichelsonMap, TezosToolkit } from "@taquito/taquito"; +import { char2Bytes } from "@taquito/utils"; + +import nftContract from "../compiled/fa2/nft/nft.impl.mligo.json"; + +const RPC_ENDPOINT = "https://ghostnet.tezos.marigold.dev"; + +async function main() { + const Tezos = new TezosToolkit(RPC_ENDPOINT); + + //set alice key + Tezos.setProvider({ + signer: await InMemorySigner.fromSecretKey( + "edskRpm2mUhvoUjHjXgMoDRxMKhtKfww1ixmWiHCWhHuMEEbGzdnz8Ks4vgarKDtxok7HmrEo1JzkXkdkvyw7Rtw6BNtSd7MJ7" + ), + }); + + const ledger = new MichelsonMap(); + ledger.set(0, "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb"); + + const token_metadata = new MichelsonMap(); + const token_info = new MichelsonMap(); + token_info.set("name", char2Bytes("My super token")); + token_info.set("description", char2Bytes("Lorem ipsum ...")); + token_info.set("symbol", char2Bytes("XXX")); + token_info.set("decimals", char2Bytes("0")); + + token_metadata.set(0, { token_id: 0, token_info }); + + const metadata = new MichelsonMap(); + metadata.set("", char2Bytes("tezos-storage:data")); + metadata.set( + "data", + char2Bytes(`{ + "name":"FA2", + "description":"Example FA2 implementation", + "version":"0.1.0", + "license":{"name":"MIT"}, + "authors":["Benjamin Fuentes"], + "homepage":"", + "source":{"tools":["Ligo"], "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors":[], + "views":[] + + }`) + ); + + const operators = new MichelsonMap(); + + const initialStorage = { + ledger, + metadata, + token_metadata, + operators, + }; + + try { + const originated = await Tezos.contract.originate({ + code: nftContract, + storage: initialStorage, + }); + console.log( + `Waiting for nftContract ${originated.contractAddress} to be confirmed...` + ); + await originated.confirmation(2); + console.log("confirmed contract: ", originated.contractAddress); + } catch (error: any) { + console.log(error); + } +} + +main(); diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/package-lock.json b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/package-lock.json new file mode 100644 index 0000000..a5227c6 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/package-lock.json @@ -0,0 +1,1300 @@ +{ + "name": "deploy-nft", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "deploy-nft", + "version": "1.0.0", + "dependencies": { + "@taquito/signer": "^17.3.1", + "@taquito/taquito": "^17.3.1", + "@taquito/utils": "^17.3.1" + }, + "devDependencies": { + "typescript": "^5.2.2" + } + }, + "node_modules/@stablelib/binary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", + "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "dependencies": { + "@stablelib/int": "^1.0.1" + } + }, + "node_modules/@stablelib/blake2b": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/blake2b/-/blake2b-1.0.1.tgz", + "integrity": "sha512-B3KyKoBAjkIFeH7romcF96i+pVFYk7K2SBQ1pZvaxV+epSBXJ+n0C66esUhyz6FF+5FbdQVm77C5fzGFcEZpKA==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/bytes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz", + "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==" + }, + "node_modules/@stablelib/constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz", + "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==" + }, + "node_modules/@stablelib/ed25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz", + "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==", + "dependencies": { + "@stablelib/random": "^1.0.2", + "@stablelib/sha512": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/hash": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", + "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==" + }, + "node_modules/@stablelib/hmac": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz", + "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==", + "dependencies": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/int": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==" + }, + "node_modules/@stablelib/keyagreement": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz", + "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==", + "dependencies": { + "@stablelib/bytes": "^1.0.1" + } + }, + "node_modules/@stablelib/nacl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stablelib/nacl/-/nacl-1.0.4.tgz", + "integrity": "sha512-PJ2U/MrkXSKUM8C4qFs87WeCNxri7KQwR8Cdwm9q2sweGuAtTvOJGuW0F3N+zn+ySLPJA98SYWSSpogMJ1gCmw==", + "dependencies": { + "@stablelib/poly1305": "^1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/wipe": "^1.0.1", + "@stablelib/x25519": "^1.0.3", + "@stablelib/xsalsa20": "^1.0.2" + } + }, + "node_modules/@stablelib/pbkdf2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/pbkdf2/-/pbkdf2-1.0.1.tgz", + "integrity": "sha512-d5jwK6jW1DkMyzqY8D1Io+fRXcsUVr95lk5LKX9ghaUdAITTc1ZL0bff+R0IrwSixbHluxhnivG7vDw59AZ/Nw==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/hmac": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/poly1305": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz", + "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==", + "dependencies": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/random": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", + "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/salsa20": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/salsa20/-/salsa20-1.0.2.tgz", + "integrity": "sha512-nfjKzw0KTKrrKBasEP+j7UP4I8Xudom8lVZIBCp0kQNARXq72IlSic0oabg2FC1NU68L4RdHrNJDd8bFwrphYA==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/constant-time": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/sha512": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz", + "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/wipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==" + }, + "node_modules/@stablelib/x25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz", + "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==", + "dependencies": { + "@stablelib/keyagreement": "^1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/xsalsa20": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/xsalsa20/-/xsalsa20-1.0.2.tgz", + "integrity": "sha512-7XdBGbcNgBShmuhDXv1G1WPVCkjZdkb1oPMzSidO7Fve0MHntH6TjFkj5bfLI+aRE+61weO076vYpP/jmaAYog==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/salsa20": "^1.0.2", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@taquito/core": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/core/-/core-17.3.1.tgz", + "integrity": "sha512-dk8ZXuZktfoIV5ESUx3mPkJxLBVL7o3CXLsaVoiPIu2nyd4I/VNkPh+aIOrhxHSVPBib3sVYN0Pc2a8ZO+0gsg==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/http-utils": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-17.3.1.tgz", + "integrity": "sha512-lHwkNM1sx1HmzJHuxQy3lxaksZH/Jqxq5cYEPJAeCzEj68TD4T4X2rcVPpa0b6Qka5mQgLITCbyFE+RUg+orgA==", + "dependencies": { + "@taquito/core": "^17.3.1", + "axios": "0.26.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/local-forging": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/local-forging/-/local-forging-17.3.1.tgz", + "integrity": "sha512-1pBbN8g2Jhq7bxWW3diRC+llL5TA1/m9W2za75IAl2sv5oo8ttXVla4XY8yapLu/yeOWrb5ta7yvfEZ5x2ZeOw==", + "dependencies": { + "@taquito/core": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/michel-codec": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-17.3.1.tgz", + "integrity": "sha512-dxhrqn+/VBzkhL+bhLO9bVb1r/NKdvSYEoXRWgszNT+enVlokkFBM4kXcvGlFUZklaSiw0dQYd1Zk0sDMkr1sw==", + "dependencies": { + "@taquito/core": "^17.3.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/michelson-encoder": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-17.3.1.tgz", + "integrity": "sha512-PaJYlZnjqDwjvK2qC4j9icqcGLoHHQygnGLs9lPV1quAV1v9yWPe6ABK+miuq2vv4WDMFH6amaXBtLimgPDcuQ==", + "dependencies": { + "@taquito/rpc": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0", + "fast-json-stable-stringify": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/rpc": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/rpc/-/rpc-17.3.1.tgz", + "integrity": "sha512-VHY5qgUVT4RDXDv7H8DQrrMk1tfnJ6m+BFHmJxYCe7WQCCr8u2TlN0X2N95QhM+LG0LXL/LFlzhQLRBOxLnxsw==", + "dependencies": { + "@taquito/core": "^17.3.1", + "@taquito/http-utils": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/signer": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/signer/-/signer-17.3.1.tgz", + "integrity": "sha512-9fwUuL8vEtzRAc0wX2rYNTkCd4Rhgp2JPrQ7aLz6QWZg0qa43TwjQ1f5o862ryp8PkmJBcA/z9pbD/XHizXfOQ==", + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@stablelib/hmac": "^1.0.1", + "@stablelib/nacl": "^1.0.4", + "@stablelib/pbkdf2": "^1.0.1", + "@stablelib/sha512": "^1.0.1", + "@taquito/taquito": "^17.3.1", + "@taquito/utils": "^17.3.1", + "@types/bn.js": "^5.1.1", + "bip39": "3.0.4", + "elliptic": "^6.5.4", + "pbkdf2": "^3.1.2", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/taquito": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/taquito/-/taquito-17.3.1.tgz", + "integrity": "sha512-9CnIJv5z6KmYYhycOSTpSh51hH818yzXMjr5iR4Q2raWEtWQHYeXoDcVec1dkI+IITm9cQpLp5Gm++smSBElOA==", + "hasInstallScript": true, + "dependencies": { + "@taquito/core": "^17.3.1", + "@taquito/http-utils": "^17.3.1", + "@taquito/local-forging": "^17.3.1", + "@taquito/michel-codec": "^17.3.1", + "@taquito/michelson-encoder": "^17.3.1", + "@taquito/rpc": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/utils": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/utils/-/utils-17.3.1.tgz", + "integrity": "sha512-NLSFOaZbbs5L7aSV+vgCxj6celHBYLkzwmGvPiCm/mDSj1a1i4bgt8fJ6DbtwDiAmiA9tXPmRileRC4iPEaewg==", + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@taquito/core": "^17.3.1", + "@types/bs58check": "^2.1.0", + "bignumber.js": "^9.1.0", + "blakejs": "^1.2.1", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "elliptic": "^6.5.4", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/bs58check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz", + "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", + "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==" + }, + "node_modules/axios": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", + "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/bip39/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/typedarray-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", + "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + }, + "dependencies": { + "@stablelib/binary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", + "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "requires": { + "@stablelib/int": "^1.0.1" + } + }, + "@stablelib/blake2b": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/blake2b/-/blake2b-1.0.1.tgz", + "integrity": "sha512-B3KyKoBAjkIFeH7romcF96i+pVFYk7K2SBQ1pZvaxV+epSBXJ+n0C66esUhyz6FF+5FbdQVm77C5fzGFcEZpKA==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/bytes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz", + "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==" + }, + "@stablelib/constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz", + "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==" + }, + "@stablelib/ed25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz", + "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==", + "requires": { + "@stablelib/random": "^1.0.2", + "@stablelib/sha512": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/hash": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", + "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==" + }, + "@stablelib/hmac": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz", + "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==", + "requires": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/int": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==" + }, + "@stablelib/keyagreement": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz", + "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==", + "requires": { + "@stablelib/bytes": "^1.0.1" + } + }, + "@stablelib/nacl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stablelib/nacl/-/nacl-1.0.4.tgz", + "integrity": "sha512-PJ2U/MrkXSKUM8C4qFs87WeCNxri7KQwR8Cdwm9q2sweGuAtTvOJGuW0F3N+zn+ySLPJA98SYWSSpogMJ1gCmw==", + "requires": { + "@stablelib/poly1305": "^1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/wipe": "^1.0.1", + "@stablelib/x25519": "^1.0.3", + "@stablelib/xsalsa20": "^1.0.2" + } + }, + "@stablelib/pbkdf2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/pbkdf2/-/pbkdf2-1.0.1.tgz", + "integrity": "sha512-d5jwK6jW1DkMyzqY8D1Io+fRXcsUVr95lk5LKX9ghaUdAITTc1ZL0bff+R0IrwSixbHluxhnivG7vDw59AZ/Nw==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/hmac": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/poly1305": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz", + "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==", + "requires": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/random": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", + "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/salsa20": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/salsa20/-/salsa20-1.0.2.tgz", + "integrity": "sha512-nfjKzw0KTKrrKBasEP+j7UP4I8Xudom8lVZIBCp0kQNARXq72IlSic0oabg2FC1NU68L4RdHrNJDd8bFwrphYA==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/constant-time": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/sha512": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz", + "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/wipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==" + }, + "@stablelib/x25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz", + "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==", + "requires": { + "@stablelib/keyagreement": "^1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/wipe": "^1.0.1" + } + }, + "@stablelib/xsalsa20": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/xsalsa20/-/xsalsa20-1.0.2.tgz", + "integrity": "sha512-7XdBGbcNgBShmuhDXv1G1WPVCkjZdkb1oPMzSidO7Fve0MHntH6TjFkj5bfLI+aRE+61weO076vYpP/jmaAYog==", + "requires": { + "@stablelib/binary": "^1.0.1", + "@stablelib/salsa20": "^1.0.2", + "@stablelib/wipe": "^1.0.1" + } + }, + "@taquito/core": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/core/-/core-17.3.1.tgz", + "integrity": "sha512-dk8ZXuZktfoIV5ESUx3mPkJxLBVL7o3CXLsaVoiPIu2nyd4I/VNkPh+aIOrhxHSVPBib3sVYN0Pc2a8ZO+0gsg==" + }, + "@taquito/http-utils": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-17.3.1.tgz", + "integrity": "sha512-lHwkNM1sx1HmzJHuxQy3lxaksZH/Jqxq5cYEPJAeCzEj68TD4T4X2rcVPpa0b6Qka5mQgLITCbyFE+RUg+orgA==", + "requires": { + "@taquito/core": "^17.3.1", + "axios": "0.26.0" + } + }, + "@taquito/local-forging": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/local-forging/-/local-forging-17.3.1.tgz", + "integrity": "sha512-1pBbN8g2Jhq7bxWW3diRC+llL5TA1/m9W2za75IAl2sv5oo8ttXVla4XY8yapLu/yeOWrb5ta7yvfEZ5x2ZeOw==", + "requires": { + "@taquito/core": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0" + } + }, + "@taquito/michel-codec": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-17.3.1.tgz", + "integrity": "sha512-dxhrqn+/VBzkhL+bhLO9bVb1r/NKdvSYEoXRWgszNT+enVlokkFBM4kXcvGlFUZklaSiw0dQYd1Zk0sDMkr1sw==", + "requires": { + "@taquito/core": "^17.3.1" + } + }, + "@taquito/michelson-encoder": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-17.3.1.tgz", + "integrity": "sha512-PaJYlZnjqDwjvK2qC4j9icqcGLoHHQygnGLs9lPV1quAV1v9yWPe6ABK+miuq2vv4WDMFH6amaXBtLimgPDcuQ==", + "requires": { + "@taquito/rpc": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0", + "fast-json-stable-stringify": "^2.1.0" + } + }, + "@taquito/rpc": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/rpc/-/rpc-17.3.1.tgz", + "integrity": "sha512-VHY5qgUVT4RDXDv7H8DQrrMk1tfnJ6m+BFHmJxYCe7WQCCr8u2TlN0X2N95QhM+LG0LXL/LFlzhQLRBOxLnxsw==", + "requires": { + "@taquito/core": "^17.3.1", + "@taquito/http-utils": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0" + } + }, + "@taquito/signer": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/signer/-/signer-17.3.1.tgz", + "integrity": "sha512-9fwUuL8vEtzRAc0wX2rYNTkCd4Rhgp2JPrQ7aLz6QWZg0qa43TwjQ1f5o862ryp8PkmJBcA/z9pbD/XHizXfOQ==", + "requires": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@stablelib/hmac": "^1.0.1", + "@stablelib/nacl": "^1.0.4", + "@stablelib/pbkdf2": "^1.0.1", + "@stablelib/sha512": "^1.0.1", + "@taquito/taquito": "^17.3.1", + "@taquito/utils": "^17.3.1", + "@types/bn.js": "^5.1.1", + "bip39": "3.0.4", + "elliptic": "^6.5.4", + "pbkdf2": "^3.1.2", + "typedarray-to-buffer": "^4.0.0" + } + }, + "@taquito/taquito": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/taquito/-/taquito-17.3.1.tgz", + "integrity": "sha512-9CnIJv5z6KmYYhycOSTpSh51hH818yzXMjr5iR4Q2raWEtWQHYeXoDcVec1dkI+IITm9cQpLp5Gm++smSBElOA==", + "requires": { + "@taquito/core": "^17.3.1", + "@taquito/http-utils": "^17.3.1", + "@taquito/local-forging": "^17.3.1", + "@taquito/michel-codec": "^17.3.1", + "@taquito/michelson-encoder": "^17.3.1", + "@taquito/rpc": "^17.3.1", + "@taquito/utils": "^17.3.1", + "bignumber.js": "^9.1.0", + "rxjs": "^7.8.1" + } + }, + "@taquito/utils": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@taquito/utils/-/utils-17.3.1.tgz", + "integrity": "sha512-NLSFOaZbbs5L7aSV+vgCxj6celHBYLkzwmGvPiCm/mDSj1a1i4bgt8fJ6DbtwDiAmiA9tXPmRileRC4iPEaewg==", + "requires": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@taquito/core": "^17.3.1", + "@types/bs58check": "^2.1.0", + "bignumber.js": "^9.1.0", + "blakejs": "^1.2.1", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "elliptic": "^6.5.4", + "typedarray-to-buffer": "^4.0.0" + } + }, + "@types/bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", + "requires": { + "@types/node": "*" + } + }, + "@types/bs58check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz", + "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", + "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==" + }, + "axios": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", + "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", + "requires": { + "follow-redirects": "^1.14.8" + } + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, + "bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + } + } + }, + "blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "typedarray-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", + "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==" + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } +} diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/package.json b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/package.json new file mode 100644 index 0000000..cfd730b --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/package.json @@ -0,0 +1,16 @@ +{ + "name": "deploy-nft", + "version": "1.0.0", + "description": "", + "scripts": { + "start": "tsc && node index.js" + }, + "dependencies": { + "@taquito/signer": "^17.3.1", + "@taquito/taquito": "^17.3.1", + "@taquito/utils": "^17.3.1" + }, + "devDependencies": { + "typescript": "^5.2.2" + } +} diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/tsconfig.json b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/tsconfig.json new file mode 100644 index 0000000..b1b1546 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/deploy/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + "resolveJsonModule": true /* Enable importing .json files. */, + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/marketplace.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/marketplace.jsligo new file mode 100644 index 0000000..1173abc --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/marketplace.jsligo @@ -0,0 +1,88 @@ +#import "../lib/main.mligo" "FA2" + +import Contract = FA2.NFT + +// FIXME These files make no sense and should probably be removed +// but here we're just showcasing how to import the library + +export type storage = { + administrators: set
, + ledger: Contract.ledger, + metadata: Contract.TZIP16.metadata, + token_metadata: Contract.TZIP12.tokenMetadata, + operators: Contract.operators, +}; + +type ret = [list, storage]; + +@entry +const transfer = (p: Contract.TZIP12.transfer, s: storage): ret => { + const ret2: [list, Contract.storage] = + Contract.transfer( + p, + { + ledger: s.ledger, + metadata: s.metadata, + token_metadata: s.token_metadata, + operators: s.operators, + } + ); + return [ + ret2[0], + { + ...s, + ledger: ret2[1].ledger, + metadata: ret2[1].metadata, + token_metadata: ret2[1].token_metadata, + operators: ret2[1].operators, + } + ] +}; + +@entry +const balance_of = (p: Contract.TZIP12.balance_of, s: storage): ret => { + const ret2: [list, Contract.storage] = + Contract.balance_of( + p, + { + ledger: s.ledger, + metadata: s.metadata, + token_metadata: s.token_metadata, + operators: s.operators, + } + ); + return [ + ret2[0], + { + ...s, + ledger: ret2[1].ledger, + metadata: ret2[1].metadata, + token_metadata: ret2[1].token_metadata, + operators: ret2[1].operators, + } + ] +}; + +@entry +const update_operators = (p: Contract.TZIP12.update_operators, s: storage): ret => { + const ret2: [list, Contract.storage] = + Contract.update_operators( + p, + { + ledger: s.ledger, + metadata: s.metadata, + token_metadata: s.token_metadata, + operators: s.operators, + } + ); + return [ + ret2[0], + { + ...s, + ledger: ret2[1].ledger, + metadata: ret2[1].metadata, + token_metadata: ret2[1].token_metadata, + operators: ret2[1].operators, + } + ] +}; diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/mintable.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/mintable.mligo new file mode 100644 index 0000000..28756d8 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/mintable.mligo @@ -0,0 +1,62 @@ +#import "../lib/main.mligo" "FA2" + +module NFT = FA2.NFTExtendable + +type extension = { + admin: address +} + +type storage = extension NFT.storage +type ret = operation list * storage + +(* Extension *) + +type mint = { + owner : address; + token_id : nat; +} + +[@entry] +let mint (mint : mint) (s : storage): ret = + let sender = Tezos.get_sender () in + let () = assert (sender = s.extension.admin) in + let () = NFT.Assertions.assert_token_exist s.token_metadata mint.token_id in + (* Check that nobody owns the token already *) + let () = assert (Option.is_none (Big_map.find_opt mint.token_id s.ledger)) in + let s = NFT.set_balance s mint.owner mint.token_id in + [], s + +(* Standard FA2 interface, copied from the source *) + +[@entry] +let transfer (t: NFT.TZIP12.transfer) (s: storage) : ret = + NFT.transfer t s + +[@entry] +let balance_of (b: NFT.TZIP12.balance_of) (s: storage) : ret = + NFT.balance_of b s + +[@entry] +let update_operators (u: NFT.TZIP12.update_operators) (s: storage) : ret = + NFT.update_operators u s + +[@view] +let get_balance (p : (address * nat)) (s : storage) : nat = + NFT.get_balance p s + +[@view] +let total_supply (token_id : nat) (s : storage) : nat = + NFT.total_supply token_id s + +[@view] +let all_tokens (_ : unit) (s : storage) : nat set = + NFT.all_tokens () s + +[@view] +let is_operator (op : NFT.TZIP12.operator) (s : storage) : bool = + NFT.is_operator op s + +[@view] +let token_metadata (p : nat) (s : storage) : NFT.TZIP12.tokenMetadataData = + NFT.token_metadata p s + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/myTzip12NFTImplementation.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/myTzip12NFTImplementation.jsligo new file mode 100644 index 0000000..f43d606 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/examples/myTzip12NFTImplementation.jsligo @@ -0,0 +1,60 @@ +#import "../lib/fa2/common/errors.mligo" "Errors" + +#import "../lib/fa2/common/assertions.jsligo" "Assertions" + +#import "../lib/fa2/common/tzip12.datatypes.jsligo" "TZIP12" + +#import "../lib/fa2/common/tzip12.interfaces.jsligo" "TZIP12Interface" + +#import "../lib/fa2/common/tzip16.datatypes.jsligo" "TZIP16" + +export namespace NFT implements TZIP12Interface.FA2{ + export type ledger = big_map; + type operator = address; + export type operators = big_map<[address, operator], set>; + export type storage = { + extension: unit, + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata, + }; + type ret = [list, storage]; + @entry + const transfer = (p: TZIP12.transfer, s: storage): ret => { + failwith("TODO"); + }; + @entry + const balance_of = (p: TZIP12.balance_of, s: storage): ret => { + failwith("TODO"); + }; + @entry + const update_operators = (p: TZIP12.update_operators, s: storage): ret => { + failwith("TODO"); + }; + + @view + const get_balance = (p: [address, nat], s: storage): nat => { + failwith("TODO"); + } + + @view + const total_supply = (token_id: nat, s: storage): nat => { + failwith("TODO"); + } + + @view + const all_tokens = (_: unit, s: storage): set => { + failwith("TODO"); + } + + @view + const is_operator = (op: TZIP12.operator, s: storage): bool => { + failwith("TODO"); + } + + @view + const token_metadata = (p: nat, s: storage): TZIP12.tokenMetadataData => { + failwith("TODO"); + } +} diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_multi_asset.impl.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_multi_asset.impl.jsligo new file mode 100644 index 0000000..1895d3b --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_multi_asset.impl.jsligo @@ -0,0 +1,236 @@ +#import "../common/assertions.jsligo" "Assertions" + +#import "../common/errors.mligo" "Errors" + +#import "../common/tzip12.datatypes.jsligo" "TZIP12" + +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +export type ledger = big_map<[address, nat], nat>; + +export type operator = address; + +export type operators = big_map<[address, operator], set>; + +export type storage = { + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata, + extension: T +}; + +type ret = [list, storage]; + +const make_storage = (extension) => + ( + { + ledger: Big_map.empty, + operators: Big_map.empty, + token_metadata: Big_map.empty, + metadata: Big_map.empty, + extension: extension + } + ) + +//operators +export const assert_authorisation = ( + [operators, from_, token_id]: [operators, address, nat] +): unit => { + const sender_ = (Tezos.get_sender()); + if (sender_ != from_) { + const authorized = + match((Big_map.find_opt([from_, sender_], operators))) { + when (Some(a)): + a + when (None()): + Set.empty + }; + if (! (Set.mem(token_id, authorized))) { + return failwith(Errors.not_operator) + } + } +}; + +export const add_operator = ( + [operators, owner, operator, token_id]: [operators, address, operator, nat] +): operators => { + if (owner == operator) { + return operators + } // assert_authorisation always allow the owner so this case is not relevant + else { + Assertions.assert_update_permission(owner); + let auth_tokens = + match(Big_map.find_opt([owner, operator], operators)) { + when (Some(ts)): + ts + when (None()): + Set.empty + }; + auth_tokens = Set.add(token_id, auth_tokens); + return Big_map.update([owner, operator], Some(auth_tokens), operators) + } +}; + +export const remove_operator = ( + [operators, owner, operator, token_id]: [operators, address, operator, nat] +): operators => { + if (owner == operator) { + return operators + } // assert_authorisation always allow the owner so this case is not relevant + else { + Assertions.assert_update_permission(owner); + const auth_tokens: option> = + match(Big_map.find_opt([owner, operator], operators)) { + when (Some(toks)): + do { + const ts = Set.remove(token_id, toks); + if (Set.cardinal(ts) == 0n) { + return None() + } else { + return Some(ts) + } + } + when (None()): + None() + }; + return Big_map.update([owner, operator], auth_tokens, operators) + } +} + +// ledger +export const get_for_user = ([ledger, owner, token_id]: [ledger, address, nat]): nat => + match((Big_map.find_opt([owner, token_id], ledger))) { + when (Some(a)): + a + when (None()): + 0 as nat + }; + +const set_for_user = ( + [ledger, owner, token_id, amount_]: [ledger, address, nat, nat] +): ledger => + Big_map.update([owner, token_id], Some(amount_), ledger); + +export const decrease_token_amount_for_user = ( + [ledger, from_, token_id, amount_]: [ledger, address, nat, nat] +): ledger => { + let balance_ = get_for_user([ledger, from_, token_id]); + assert_with_error((balance_ >= amount_), Errors.ins_balance); + balance_ = abs(balance_ - amount_); + return set_for_user([ledger, from_, token_id, balance_]) +}; + +export const increase_token_amount_for_user = ( + [ledger, to_, token_id, amount_]: [ledger, address, nat, nat] +): ledger => { + let balance_ = get_for_user([ledger, to_, token_id]); + balance_ = balance_ + amount_; + return set_for_user([ledger, to_, token_id, balance_]) +} + +// storage +export const set_ledger = ([s, ledger]: [storage, ledger]): storage => + ({ ...s, ledger: ledger }); + +export const get_operators = (s: storage): operators => s.operators; + +export const set_operators = ([s, operators]: [storage, operators]): storage< + T +> => + ({ ...s, operators: operators }) + +export const transfer = (t: TZIP12.transfer, s: storage): ret => { + const process_atomic_transfer = (from_: address) => + ([l, t]: [ledger, TZIP12.atomic_trans]): ledger => { + const { to_, token_id, amount } = t; + Assertions.assert_token_exist(s.token_metadata, token_id); + assert_authorisation([s.operators, from_, token_id]); + let ledger = + decrease_token_amount_for_user([l, from_, token_id, amount]); + ledger + = increase_token_amount_for_user([ledger, to_, token_id, amount]); + return ledger + }; + const process_single_transfer = ([l, t]: [ledger, TZIP12.transfer_from]): ledger => { + const { from_, txs } = t; + const ledger = List.fold_left(process_atomic_transfer(from_), l, txs); + return ledger + }; + const ledger = List.fold_left(process_single_transfer, s.ledger, t); + return [list([]), set_ledger([s, ledger])] +}; + +export const balance_of = (b: TZIP12.balance_of, s: storage): ret => { + const { requests, callback } = b; + const get_balance_info = (request: TZIP12.request): TZIP12.callback => { + const { owner, token_id } = request; + Assertions.assert_token_exist(s.token_metadata, token_id); + const balance_ = get_for_user([s.ledger, owner, token_id]); + return ({ request: request, balance: balance_ }) + }; + const callback_param = List.map(get_balance_info, requests); + const operation = Tezos.transaction(Main(callback_param), 0mutez, callback); + return [list([operation]), s] +}; + +export const update_operators = ( + updates: TZIP12.update_operators, + s: storage +): ret => { + const update_operator = ( + [operators, update]: [operators, TZIP12.unit_update] + ): operators => + match(update) { + when (Add_operator(operator)): + add_operator( + [operators, operator.owner, operator.operator, operator.token_id] + ) + when (Remove_operator(operator)): + remove_operator( + [operators, operator.owner, operator.operator, operator.token_id] + ) + }; + let operators = get_operators(s); + operators = List.fold_left(update_operator, operators, updates); + const store = set_operators([s, operators]); + return [list([]), store] +}; + +export const get_balance = (p: [address, nat], s: storage): nat => { + const [owner, token_id] = p; + Assertions.assert_token_exist(s.token_metadata, token_id); + return match(Big_map.find_opt([owner, token_id], s.ledger)) { + when (None()): + 0n + when (Some(n)): + n + } +}; + +export const total_supply = (_token_id: nat, _s: storage): nat => + failwith(Errors.not_available); + +export const all_tokens = (_: unit, _s: storage): set => + failwith(Errors.not_available); + +export const is_operator = (op: TZIP12.operator, s: storage): bool => { + const authorized = + match(Big_map.find_opt([op.owner, op.operator], s.operators)) { + when (Some(opSet)): + opSet + when (None()): + Set.empty + }; + return (Set.size(authorized) > 0n || op.owner == op.operator) +}; + +export const token_metadata = (p: nat, s: storage): TZIP12. +tokenMetadataData => { + return match(Big_map.find_opt(p, s.token_metadata)) { + when (Some(data)): + data + when (None()): + failwith(Errors.undefined_token) + } +}; diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_multi_asset.impl.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_multi_asset.impl.mligo new file mode 100644 index 0000000..b932d19 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_multi_asset.impl.mligo @@ -0,0 +1,228 @@ +#import "../common/assertions.jsligo" "Assertions" +#import "../common/errors.mligo" "Errors" +#import "../common/tzip12.datatypes.jsligo" "TZIP12" +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +type ledger = ((address * nat), nat) big_map + +type operator = address + +type operators = ((address * operator), nat set) big_map + +type 'a storage = + { + ledger : ledger; + operators : operators; + token_metadata : TZIP12.tokenMetadata; + metadata : TZIP16.metadata; + extension : 'a + } + +type 'a ret = operation list * 'a storage + +let make_storage (type a) (extension : a) : a storage = + { + ledger = Big_map.empty; + operators = Big_map.empty; + token_metadata = Big_map.empty; + metadata = Big_map.empty; + extension = extension + } + +// Operators +let assert_authorisation + (operators : operators) + (from_ : address) + (token_id : nat) +: unit = + let sender_ = (Tezos.get_sender ()) in + if (sender_ = from_) + then () + else + let authorized = + match Big_map.find_opt (from_, sender_) operators with + Some (a) -> a + | None -> Set.empty in + if Set.mem token_id authorized then () else failwith Errors.not_operator + +let add_operator + (operators : operators) + (owner : address) + (operator : operator) + (token_id : nat) +: operators = + if owner = operator + then operators + (* assert_authorisation always allow the owner so this case is not relevant *) + else + let () = Assertions.assert_update_permission owner in + let auth_tokens = + match Big_map.find_opt (owner, operator) operators with + Some (ts) -> ts + | None -> Set.empty in + let auth_tokens = Set.add token_id auth_tokens in + Big_map.update (owner, operator) (Some auth_tokens) operators + +let remove_operator + (operators : operators) + (owner : address) + (operator : operator) + (token_id : nat) +: operators = + if owner = operator + then operators + (* assert_authorisation always allow the owner so this case is not relevant *) + else + let () = Assertions.assert_update_permission owner in + let auth_tokens = + match Big_map.find_opt (owner, operator) operators with + None -> None + | Some (ts) -> + let ts = Set.remove token_id ts in + if (Set.size ts = 0n) then None else Some (ts) in + Big_map.update (owner, operator) auth_tokens operators + +// Ledger +let get_for_user (ledger : ledger) (owner : address) (token_id : nat) : nat = + match Big_map.find_opt (owner, token_id) ledger with + Some (a) -> a + | None -> 0n + +let set_for_user + (ledger : ledger) + (owner : address) + (token_id : nat) + (amount_ : nat) +: ledger = Big_map.update (owner, token_id) (Some amount_) ledger + +let decrease_token_amount_for_user + (ledger : ledger) + (from_ : address) + (token_id : nat) + (amount_ : nat) +: ledger = + let balance_ = get_for_user ledger from_ token_id in + let () = assert_with_error (balance_ >= amount_) Errors.ins_balance in + let balance_ = abs (balance_ - amount_) in + let ledger = set_for_user ledger from_ token_id balance_ in + ledger + +let increase_token_amount_for_user + (ledger : ledger) + (to_ : address) + (token_id : nat) + (amount_ : nat) +: ledger = + let balance_ = get_for_user ledger to_ token_id in + let balance_ = balance_ + amount_ in + let ledger = set_for_user ledger to_ token_id balance_ in + ledger + +// Storage +let assert_token_exist (type a) (s : a storage) (token_id : nat) : unit = + let _ = + Option.unopt_with_error + (Big_map.find_opt token_id s.token_metadata) + Errors.undefined_token in + () + +let set_ledger (type a) (s : a storage) (ledger : ledger) = + {s with ledger = ledger} + +let get_operators (type a) (s : a storage) = s.operators + +let set_operators (type a) (s : a storage) (operators : operators) = + {s with operators = operators} + +let transfer (type a) (t : TZIP12.transfer) (s : a storage) : a ret = + (* This function process the "txs" list. Since all transfer share the same "from_" address, we use a se *) + let process_atomic_transfer + (from_ : address) + (ledger, t : ledger * TZIP12.atomic_trans) = + let { + to_; + token_id; + amount = amount_ + } = t in + let () = assert_token_exist s token_id in + let () = assert_authorisation s.operators from_ token_id in + let ledger = decrease_token_amount_for_user ledger from_ token_id amount_ in + let ledger = increase_token_amount_for_user ledger to_ token_id amount_ in + ledger in + let process_single_transfer (ledger, t : ledger * TZIP12.transfer_from) = + let { + from_; + txs + } = t in + let ledger = List.fold_left (process_atomic_transfer from_) ledger txs in + ledger in + let ledger = List.fold_left process_single_transfer s.ledger t in + ([] : operation list), set_ledger s ledger + +let balance_of (type a) (b : TZIP12.balance_of) (s : a storage) : a ret = + let { + requests; + callback + } = b in + let get_balance_info (request : TZIP12.request) : TZIP12.callback = + let { + owner; + token_id + } = request in + let () = assert_token_exist s token_id in + let balance_ = get_for_user s.ledger owner token_id in + { + request = request; + balance = balance_ + } in + let callback_param = List.map get_balance_info requests in + let operation = Tezos.transaction (Main callback_param) 0mutez callback in + ([operation] : operation list), s + +let update_operators (type a) + (updates : TZIP12.update_operators) + (s : a storage) +: a ret = + let update_operator (operators, update : operators * TZIP12.unit_update) = + match update with + Add_operator + { + owner = owner; + operator = operator; + token_id = token_id + } -> add_operator operators owner operator token_id + | Remove_operator + { + owner = owner; + operator = operator; + token_id = token_id + } -> remove_operator operators owner operator token_id in + let operators = get_operators s in + let operators = List.fold_left update_operator operators updates in + let s = set_operators s operators in + ([] : operation list), s + +let get_balance (type a) (p : (address * nat)) (s : a storage) : nat = + let (owner, token_id) = p in + let () = assert_token_exist s token_id in + match Big_map.find_opt (owner, token_id) s.ledger with + None -> 0n + | Some (n) -> n + +let total_supply (type a) (_token_id : nat) (_s : a storage) : nat = + failwith Errors.not_available + +let all_tokens (type a) (_ : unit) (_s : a storage) : nat set = + failwith Errors.not_available + +let is_operator (type a) (op : TZIP12.operator) (s : a storage) : bool = + let authorized = + match Big_map.find_opt (op.owner, op.operator) s.operators with + Some (opSet) -> opSet + | None -> Set.empty in + Set.size authorized > 0n || op.owner = op.operator + +let token_metadata (type a) (p : nat) (s : a storage) : TZIP12.tokenMetadataData = + match Big_map.find_opt p s.token_metadata with + Some (data) -> data + | None () -> failwith Errors.undefined_token diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_single_asset.impl.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_single_asset.impl.jsligo new file mode 100644 index 0000000..8a2bf35 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_single_asset.impl.jsligo @@ -0,0 +1,246 @@ +#import "../common/assertions.jsligo" "Assertions" + +#import "../common/errors.mligo" "Errors" + +#import "../common/tzip12.datatypes.jsligo" "TZIP12" + +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +export type ledger = big_map; + +export type operator = address; + +export type operators = big_map>; + +export type storage = { + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata, + extension: T +}; + +type ret = [list, storage]; + +const make_storage = (extension) => + ( + { + ledger: Big_map.empty, + operators: Big_map.empty, + token_metadata: Big_map.empty, + metadata: Big_map.empty, + extension: extension + } + ) + +// operators +export const assert_authorisation = (operators: operators, from_: address): unit => { + const sender_ = Tezos.get_sender(); + if (sender_ == from_) return unit else { + const authorized = + match(Big_map.find_opt(from_, operators)) { + when (Some(a)): + a + when (None()): + Set.empty + }; + if (Set.mem(sender_, authorized)) return unit else failwith( + Errors.not_operator + ) + } +}; + +export const add_operator = ( + operators: operators, + owner: address, + operator: operator +): operators => { + if (owner == operator) return operators else { + const _ = Assertions.assert_update_permission(owner); + let auths = + match(Big_map.find_opt(owner, operators)) { + when (Some(os)): + os + when (None()): + Set.empty + }; + auths = Set.add(operator, auths); + return Big_map.update(owner, Some(auths), operators) + } +}; + +export const remove_operator = ( + operators: operators, + owner: address, + operator: operator +): operators => { + if (owner == operator) return operators else { + const _ = Assertions.assert_update_permission(owner); + const auths = + match(Big_map.find_opt(owner, operators)) { + when (None()): + None() + when (Some(ops)): + do { + let os = Set.remove(operator, ops); + if (Set.size(os) == 0n) return None() else return Some(os) + } + }; + return Big_map.update(owner, auths, operators) + } +} + +// ledger +export const get_for_user = (ledger: ledger, owner: address): nat => + match(Big_map.find_opt(owner, ledger)) { + when (Some(tokens)): + tokens + when (None()): + 0 as nat + }; + +const update_for_user = (ledger: ledger, owner: address, amount_: nat): ledger => + Big_map.update(owner, Some(amount_), ledger); + +export const decrease_token_amount_for_user = ( + ledger: ledger, + from_: address, + amount_: nat +): ledger => { + let tokens = get_for_user(ledger, from_); + const _ = assert_with_error(tokens >= amount_, Errors.ins_balance); + tokens = abs(tokens - amount_); + return update_for_user(ledger, from_, tokens) +}; + +export const increase_token_amount_for_user = ( + ledger: ledger, + to_: address, + amount_: nat +): ledger => { + let tokens = get_for_user(ledger, to_); + tokens = tokens + amount_; + return update_for_user(ledger, to_, tokens) +} + +// Storage +export const get_amount_for_owner = (s: storage, owner: address) => + get_for_user(s.ledger, owner); + +export const set_ledger = ([s, ledger]: [storage, ledger]): storage => + ({ ...s, ledger: ledger }); + +export const get_operators = (s: storage): operators => s.operators; + +export const set_operators = ([s, operators]: [storage, operators]): storage< + T +> => + ({ ...s, operators: operators }) + +export const transfer = (t: TZIP12.transfer, s: storage): ret => { + /* This function process the "txs" list. Since all transfer share the same "from_" address, we use a se */ + const process_atomic_transfer = (from_: address) => + ([ledger, t]: [ledger, TZIP12.atomic_trans]): ledger => { + const { to_, token_id, amount } = t; + ignore(token_id); + const _ = assert_authorisation(s.operators, from_); + let l = decrease_token_amount_for_user(ledger, from_, amount); + return increase_token_amount_for_user(l, to_, amount) + }; + const process_single_transfer = ([ledger, t]: [ledger, TZIP12.transfer_from]): ledger => { + const { from_, txs } = t; + return List.fold_left(process_atomic_transfer(from_), ledger, txs) + }; + const ledger = List.fold_left(process_single_transfer, s.ledger, t); + const store = set_ledger([s, ledger]); + return [list([]), store] +}; + +/** balance_of entrypoint +*/ +export const balance_of = (b: TZIP12.balance_of, s: storage): ret => { + const { requests, callback } = b; + const get_balance_info = (request: TZIP12.request): TZIP12.callback => { + const { owner, token_id } = request; + ignore(token_id); + const balance_ = get_amount_for_owner(s, owner); + return { request: request, balance: balance_ } + }; + const callback_param = List.map(get_balance_info, requests); + const operation = Tezos.transaction(Main(callback_param), 0mutez, callback); + return [list([operation]), s] +}; + +/** +Add or Remove token operators for the specified token owners and token IDs. + + +The entrypoint accepts a list of update_operator commands. If two different +commands in the list add and remove an operator for the same token owner and +token ID, the last command in the list MUST take effect. + + +It is possible to update operators for a token owner that does not hold any token +balances yet. + + +Operator relation is not transitive. If C is an operator of B and if B is an +operator of A, C cannot transfer tokens that are owned by A, on behalf of B. + + +*/ +export const update_operators = ( + updates: TZIP12.update_operators, + s: storage +): ret => { + const update_operator = ( + [operators, update]: [operators, TZIP12.unit_update] + ): operators => + match(update) { + when (Add_operator(operator)): + add_operator(operators, operator.owner, operator.operator) + when (Remove_operator(operator)): + remove_operator(operators, operator.owner, operator.operator) + }; + const operators = List.fold_left(update_operator, get_operators(s), updates); + const store = set_operators([s, operators]); + return [list([]), store] +}; + +export const get_balance = (p: [address, nat], s: storage): nat => { + const [owner, token_id] = p; + Assertions.assert_token_exist(s.token_metadata, token_id); + return match(Big_map.find_opt(owner, s.ledger)) { + when (None()): + 0n + when (Some(n)): + n + } +}; + +export const total_supply = (_token_id: nat, _s: storage): nat => + failwith(Errors.not_available); + +export const all_tokens = (_: unit, _s: storage): set => + failwith(Errors.not_available); + +export const is_operator = (op: TZIP12.operator, s: storage): bool => { + const authorized = + match(Big_map.find_opt(op.owner, s.operators)) { + when (Some(opSet)): + opSet + when (None()): + Set.empty + }; + return (Set.mem(op.operator, authorized) || op.owner == op.operator) +}; + +export const token_metadata = (p: nat, s: storage): TZIP12. +tokenMetadataData => { + return match(Big_map.find_opt(p, s.token_metadata)) { + when (Some(data)): + data + when (None()): + failwith(Errors.undefined_token) + } +}; diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_single_asset.impl.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_single_asset.impl.mligo new file mode 100644 index 0000000..103f386 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/extendable_single_asset.impl.mligo @@ -0,0 +1,226 @@ +#import "../common/assertions.jsligo" "Assertions" +#import "../common/errors.mligo" "Errors" +#import "../common/tzip12.datatypes.jsligo" "TZIP12" +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +type ledger = (address, nat) big_map + +type operator = address + +type operators = (address, operator set) big_map + +type 'a storage = + { + ledger : ledger; + operators : operators; + token_metadata : TZIP12.tokenMetadata; + metadata : TZIP16.metadata; + extension : 'a + } + +type 'a ret = operation list * 'a storage + +let make_storage (type a) (extension : a) : a storage = + { + ledger = Big_map.empty; + operators = Big_map.empty; + token_metadata = Big_map.empty; + metadata = Big_map.empty; + extension = extension + } + +// Operators +let assert_authorisation (operators : operators) (from_ : address) : unit = + let sender_ = (Tezos.get_sender ()) in + if (sender_ = from_) + then () + else + let authorized = + match Big_map.find_opt from_ operators with + Some (a) -> a + | None -> Set.empty in + if Set.mem sender_ authorized then () else failwith Errors.not_operator + +let add_operator (operators : operators) (owner : address) (operator : operator) +: operators = + if owner = operator + then operators + (* assert_authorisation always allow the owner so this case is not relevant *) + else + let () = Assertions.assert_update_permission owner in + let auths = + match Big_map.find_opt owner operators with + Some (os) -> os + | None -> Set.empty in + let auths = Set.add operator auths in + Big_map.update owner (Some auths) operators + +let remove_operator + (operators : operators) + (owner : address) + (operator : operator) +: operators = + if owner = operator + then operators + (* assert_authorisation always allow the owner so this case is not relevant *) + else + let () = Assertions.assert_update_permission owner in + let auths = + match Big_map.find_opt owner operators with + None -> None + | Some (os) -> + let os = Set.remove operator os in + if (Set.size os = 0n) then None else Some (os) in + Big_map.update owner auths operators + +// Ledger +let get_for_user (ledger : ledger) (owner : address) : nat = + match Big_map.find_opt owner ledger with + Some (tokens) -> tokens + | None -> 0n + +let update_for_user (ledger : ledger) (owner : address) (amount_ : nat) : ledger = + Big_map.update owner (Some amount_) ledger + +let decrease_token_amount_for_user + (ledger : ledger) + (from_ : address) + (amount_ : nat) +: ledger = + let tokens = get_for_user ledger from_ in + let () = assert_with_error (tokens >= amount_) Errors.ins_balance in + let tokens = abs (tokens - amount_) in + let ledger = update_for_user ledger from_ tokens in + ledger + +let increase_token_amount_for_user + (ledger : ledger) + (to_ : address) + (amount_ : nat) +: ledger = + let tokens = get_for_user ledger to_ in + let tokens = tokens + amount_ in + let ledger = update_for_user ledger to_ tokens in + ledger + +// Storage +let get_amount_for_owner (type a) (s : a storage) (owner : address) = + get_for_user s.ledger owner + +let set_ledger (type a) (s : a storage) (ledger : ledger) = + {s with ledger = ledger} + +let get_operators (type a) (s : a storage) = s.operators + +let set_operators (type a) (s : a storage) (operators : operators) = + {s with operators = operators} + +let transfer (type a) (t : TZIP12.transfer) (s : a storage) : a ret = + (* This function process the "txs" list. Since all transfer share the same "from_" address, we use a se *) + let process_atomic_transfer + (from_ : address) + (ledger, t : ledger * TZIP12.atomic_trans) = + let { + to_; + token_id = _token_id; + amount = amount_ + } = t in + let () = assert_authorisation s.operators from_ in + let ledger = decrease_token_amount_for_user ledger from_ amount_ in + let ledger = increase_token_amount_for_user ledger to_ amount_ in + ledger in + let process_single_transfer (ledger, t : ledger * TZIP12.transfer_from) = + let { + from_; + txs + } = t in + let ledger = List.fold_left (process_atomic_transfer from_) ledger txs in + ledger in + let ledger = List.fold_left process_single_transfer s.ledger t in + let s = set_ledger s ledger in + ([] : operation list), s + +let balance_of (type a) (b : TZIP12.balance_of) (s : a storage) : a ret = + let { + requests; + callback + } = b in + let get_balance_info (request : TZIP12.request) : TZIP12.callback = + let { + owner; + token_id = _token_id + } = request in + let balance_ = get_amount_for_owner s owner in + { + request = request; + balance = balance_ + } in + let callback_param = List.map get_balance_info requests in + let operation = Tezos.transaction (Main callback_param) 0mutez callback in + ([operation] : operation list), s + +(** +Add or Remove token operators for the specified token owners and token IDs. + + +The entrypoint accepts a list of update_operator commands. If two different +commands in the list add and remove an operator for the same token owner and +token ID, the last command in the list MUST take effect. + + +It is possible to update operators for a token owner that does not hold any token +balances yet. + + +Operator relation is not transitive. If C is an operator of B and if B is an +operator of A, C cannot transfer tokens that are owned by A, on behalf of B. + + +*) +let update_operators (type a) + (updates : TZIP12.update_operators) + (s : a storage) +: a ret = + let update_operator (operators, update : operators * TZIP12.unit_update) = + match update with + Add_operator + { + owner = owner; + operator = operator; + token_id = _token_id + } -> add_operator operators owner operator + | Remove_operator + { + owner = owner; + operator = operator; + token_id = _token_id + } -> remove_operator operators owner operator in + let operators = get_operators s in + let operators = List.fold_left update_operator operators updates in + let s = set_operators s operators in + ([] : operation list), s + +let get_balance (type a) (p : (address * nat)) (s : a storage) : nat = + let (owner, token_id) = p in + let () = Assertions.assert_token_exist s.token_metadata token_id in + match Big_map.find_opt owner s.ledger with + None -> 0n + | Some (n) -> n + +let total_supply (type a) (_token_id : nat) (_s : a storage) : nat = + failwith Errors.not_available + +let all_tokens (type a) (_ : unit) (_s : a storage) : nat set = + failwith Errors.not_available + +let is_operator (type a) (op : TZIP12.operator) (s : a storage) : bool = + let authorized = + match Big_map.find_opt (op.owner) s.operators with + Some (opSet) -> opSet + | None -> Set.empty in + Set.mem op.operator authorized || op.owner = op.operator + +let token_metadata (type a) (p : nat) (s : a storage) : TZIP12.tokenMetadataData = + match Big_map.find_opt p s.token_metadata with + Some (data) -> data + | None () -> failwith Errors.undefined_token diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/multi_asset.impl.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/multi_asset.impl.jsligo new file mode 100644 index 0000000..6b55537 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/multi_asset.impl.jsligo @@ -0,0 +1,85 @@ +#import "../common/assertions.jsligo" "Assertions" + +#import "../common/errors.mligo" "Errors" + +#import "../common/tzip12.datatypes.jsligo" "TZIP12" + +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +#import "./extendable_multi_asset.impl.jsligo" "MultiAssetExtendable" + +export type ledger = MultiAssetExtendable.ledger; + +export type operator = MultiAssetExtendable.operator; + +export type operators = MultiAssetExtendable.operators; + +export type storage = { + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata, +} + +type ret = [list, storage]; + +const empty_storage: storage = { + ledger: Big_map.empty, + operators: Big_map.empty, + token_metadata: Big_map.empty, + metadata: Big_map.empty +} + +@inline +const lift = (s: storage): MultiAssetExtendable.storage => { + return { + extension: unit, + ledger: s.ledger, + operators: s.operators, + token_metadata: s.token_metadata, + metadata: s.metadata + }; +} + +@inline +const unlift = ([ops, s]: [list, MultiAssetExtendable.storage]): ret => { + let storage = { + ledger: s.ledger, + operators: s.operators, + token_metadata: s.token_metadata, + metadata: s.metadata + }; + return [ops, storage]; +} + +@entry +const transfer = (t: TZIP12.transfer, s: storage): ret => + unlift(MultiAssetExtendable.transfer(t, lift(s))) + +@entry +const balance_of = (b: TZIP12.balance_of, s: storage): ret => + unlift(MultiAssetExtendable.balance_of(b, lift(s))) + +@entry +const update_operators = (updates: TZIP12.update_operators, s: storage): ret => + unlift(MultiAssetExtendable.update_operators(updates, lift(s))) + +@view +const get_balance = (p: [address, nat], s: storage): nat => + MultiAssetExtendable.get_balance(p, lift(s)) + +@view +const total_supply = (token_id: nat, s: storage): nat => + MultiAssetExtendable.total_supply(token_id, lift(s)) + +@view +const all_tokens = (_: unit, s: storage): set => + MultiAssetExtendable.all_tokens(unit, lift(s)) + +@view +const is_operator = (op: TZIP12.operator, s: storage): bool => + MultiAssetExtendable.is_operator(op, lift(s)) + +@view +const token_metadata = (p: nat, s: storage): TZIP12.tokenMetadataData => + MultiAssetExtendable.token_metadata(p, lift(s)) diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/multi_asset.impl.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/multi_asset.impl.mligo new file mode 100644 index 0000000..dfd77d7 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/multi_asset.impl.mligo @@ -0,0 +1,83 @@ +#import "../common/assertions.jsligo" "Assertions" +#import "../common/errors.mligo" "Errors" +#import "../common/tzip12.datatypes.jsligo" "TZIP12" +#import "../common/tzip12.interfaces.jsligo" "TZIP12Interface" +#import "../common/tzip16.datatypes.jsligo" "TZIP16" +#import "./extendable_multi_asset.impl.mligo" "MultiAssetExtendable" + +type ledger = MultiAssetExtendable.ledger + +type operator = MultiAssetExtendable.operator + +type operators = MultiAssetExtendable.operators + +type storage = + { + ledger : ledger; + operators : operators; + token_metadata : TZIP12.tokenMetadata; + metadata : TZIP16.metadata + } + +type ret = operation list * storage + +let empty_storage : storage = + { + ledger = Big_map.empty; + operators = Big_map.empty; + token_metadata = Big_map.empty; + metadata = Big_map.empty + } + +[@inline] +let lift (s : storage) : unit MultiAssetExtendable.storage = + { + extension = (); + ledger = s.ledger; + operators = s.operators; + token_metadata = s.token_metadata; + metadata = s.metadata + } + +[@inline] +let unlift (ret : operation list * unit MultiAssetExtendable.storage) : ret = + let ops, s = ret in + ops, + { + ledger = s.ledger; + operators = s.operators; + token_metadata = s.token_metadata; + metadata = s.metadata + } + +[@entry] +let transfer (t : TZIP12.transfer) (s : storage) : ret = + unlift (MultiAssetExtendable.transfer t (lift s)) + +[@entry] +let balance_of (b : TZIP12.balance_of) (s : storage) : ret = + unlift (MultiAssetExtendable.balance_of b (lift s)) + +[@entry] +let update_operators (updates : TZIP12.update_operators) (s : storage) : ret = + unlift (MultiAssetExtendable.update_operators updates (lift s)) + +[@view] +let get_balance (p : (address * nat)) (s : storage) : nat = + MultiAssetExtendable.get_balance p (lift s) + +[@view] +let total_supply (token_id : nat) (s : storage) : nat = + MultiAssetExtendable.total_supply token_id (lift s) + +[@view] +let all_tokens (_ : unit) (s : storage) : nat set = + MultiAssetExtendable.all_tokens () (lift s) + +[@view] +let is_operator (op : TZIP12.operator) (s : storage) : bool = + MultiAssetExtendable.is_operator op (lift s) + +[@view] +let token_metadata (p : nat) (s : storage) : TZIP12.tokenMetadataData = + MultiAssetExtendable.token_metadata p (lift s) diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/single_asset.impl.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/single_asset.impl.jsligo new file mode 100644 index 0000000..211cf22 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/single_asset.impl.jsligo @@ -0,0 +1,91 @@ +#import "../common/assertions.jsligo" "Assertions" + +#import "../common/errors.mligo" "Errors" + +#import "../common/tzip12.datatypes.jsligo" "TZIP12" + +#import "../common/tzip12.interfaces.jsligo" "TZIP12Interface" + +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +#import "./extendable_single_asset.impl.jsligo" "SingleAssetExtendable" + +export type ledger = SingleAssetExtendable.ledger; + +export type operator = SingleAssetExtendable.operator; + +export type operators = SingleAssetExtendable.operators; + +export type storage = SingleAssetExtendable.storage; + +export type storage = { + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata, +} + +type ret = [list, storage]; + +const empty_storage: storage = { + ledger: Big_map.empty, + operators: Big_map.empty, + token_metadata: Big_map.empty, + metadata: Big_map.empty +} + +@inline +const lift = (s: storage): SingleAssetExtendable.storage => { + return { + extension: unit, + ledger: s.ledger, + operators: s.operators, + token_metadata: s.token_metadata, + metadata: s.metadata + }; +} + +@inline +const unlift = ( + [ops, s]: [list, SingleAssetExtendable.storage] +): ret => { + let storage = { + ledger: s.ledger, + operators: s.operators, + token_metadata: s.token_metadata, + metadata: s.metadata + }; + return [ops, storage]; +} + +@entry +const transfer = (t: TZIP12.transfer, s: storage): ret => + unlift(SingleAssetExtendable.transfer(t, lift(s))) + +@entry +const balance_of = (b: TZIP12.balance_of, s: storage): ret => + unlift(SingleAssetExtendable.balance_of(b, lift(s))) + +@entry +const update_operators = (updates: TZIP12.update_operators, s: storage): ret => + unlift(SingleAssetExtendable.update_operators(updates, lift(s))) + +@view +const get_balance = (p: [address, nat], s: storage): nat => + SingleAssetExtendable.get_balance(p, lift(s)) + +@view +const total_supply = (token_id: nat, s: storage): nat => + SingleAssetExtendable.total_supply(token_id, lift(s)) + +@view +const all_tokens = (_: unit, s: storage): set => + SingleAssetExtendable.all_tokens(unit, lift(s)) + +@view +const is_operator = (op: TZIP12.operator, s: storage): bool => + SingleAssetExtendable.is_operator(op, lift(s)) + +@view +const token_metadata = (p: nat, s: storage): TZIP12.tokenMetadataData => + SingleAssetExtendable.token_metadata(p, lift(s)) diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/single_asset.impl.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/single_asset.impl.mligo new file mode 100644 index 0000000..08d9796 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/asset/single_asset.impl.mligo @@ -0,0 +1,85 @@ +#import "../common/assertions.jsligo" "Assertions" +#import "../common/errors.mligo" "Errors" +#import "../common/tzip12.datatypes.jsligo" "TZIP12" +#import "../common/tzip12.interfaces.jsligo" "TZIP12Interface" +#import "../common/tzip16.datatypes.jsligo" "TZIP16" +#import "./extendable_single_asset.impl.mligo" "SingleAssetExtendable" + +type ledger = SingleAssetExtendable.ledger + +type operator = SingleAssetExtendable.operator + +type operators = SingleAssetExtendable.operators + +type storage = unit SingleAssetExtendable.storage + +type storage = + { + ledger : ledger; + operators : operators; + token_metadata : TZIP12.tokenMetadata; + metadata : TZIP16.metadata + } + +type ret = operation list * storage + +let empty_storage : storage = + { + ledger = Big_map.empty; + operators = Big_map.empty; + token_metadata = Big_map.empty; + metadata = Big_map.empty + } + +[@inline] +let lift (s : storage) : unit SingleAssetExtendable.storage = + { + extension = (); + ledger = s.ledger; + operators = s.operators; + token_metadata = s.token_metadata; + metadata = s.metadata + } + +[@inline] +let unlift (ret : operation list * unit SingleAssetExtendable.storage) : ret = + let ops, s = ret in + ops, + { + ledger = s.ledger; + operators = s.operators; + token_metadata = s.token_metadata; + metadata = s.metadata + } + +[@entry] +let transfer (t : TZIP12.transfer) (s : storage) : ret = + unlift (SingleAssetExtendable.transfer t (lift s)) + +[@entry] +let balance_of (b : TZIP12.balance_of) (s : storage) : ret = + unlift (SingleAssetExtendable.balance_of b (lift s)) + +[@entry] +let update_operators (updates : TZIP12.update_operators) (s : storage) : ret = + unlift (SingleAssetExtendable.update_operators updates (lift s)) + +[@view] +let get_balance (p : (address * nat)) (s : storage) : nat = + SingleAssetExtendable.get_balance p (lift s) + +[@view] +let total_supply (token_id : nat) (s : storage) : nat = + SingleAssetExtendable.total_supply token_id (lift s) + +[@view] +let all_tokens (_ : unit) (s : storage) : nat set = + SingleAssetExtendable.all_tokens () (lift s) + +[@view] +let is_operator (op : TZIP12.operator) (s : storage) : bool = + SingleAssetExtendable.is_operator op (lift s) + +[@view] +let token_metadata (p : nat) (s : storage) : TZIP12.tokenMetadataData = + SingleAssetExtendable.token_metadata p (lift s) diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/assertions.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/assertions.jsligo new file mode 100644 index 0000000..ae64f39 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/assertions.jsligo @@ -0,0 +1,34 @@ +#import "./errors.mligo" "Errors" + +#import "tzip12.datatypes.jsligo" "TZIP12Datatypes" + +#import "tzip12.interfaces.jsligo" "TZIP12Interface" + +/** +* Check if the Tx sender is the token's owner +* @param owner : the address of the actual owner +*/ + +export const assert_update_permission = (owner: address): unit => { + return assert_with_error( + (owner == (Tezos.get_sender())), + Errors.only_sender_manage_operators + ) +} + +/** +* Check if the token id is already defined +* @param token_metadata : bigmap of token definitions +* @param token_id : the token id to test +*/ + +export const assert_token_exist = ( + token_metadata: TZIP12Datatypes.tokenMetadata, + token_id: nat +): unit => { + const _ = + Option.unopt_with_error( + Big_map.find_opt(token_id, token_metadata), + Errors.undefined_token + ) +}; diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/errors.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/errors.mligo new file mode 100644 index 0000000..3d6db0b --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/errors.mligo @@ -0,0 +1,17 @@ +type t = string + +[@no_mutation] let undefined_token = "FA2_TOKEN_UNDEFINED" +[@no_mutation] let ins_balance = "FA2_INSUFFICIENT_BALANCE" +[@no_mutation] let no_transfer = "FA2_TX_DENIED" +[@no_mutation] let not_owner = "FA2_NOT_OWNER" +[@no_mutation] let not_operator = "FA2_NOT_OPERATOR" +[@no_mutation] let not_supported = "FA2_OPERATORS_UNSUPPORTED" +[@no_mutation] let rec_hook_fail = "FA2_RECEIVER_HOOK_FAILED" +[@no_mutation] let send_hook_fail = "FA2_SENDER_HOOK_FAILED" +[@no_mutation] let rec_hook_undef = "FA2_RECEIVER_HOOK_UNDEFINED" +[@no_mutation] let send_hook_under = "FA2_SENDER_HOOK_UNDEFINED" +[@no_mutation] let wrong_amount = "WRONG_AMOUNT" + + +[@no_mutation] let only_sender_manage_operators = "The sender can only manage operators for his own token" +[@no_mutation] let not_available = "Feature not available. Maybe use an indexer instead" diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip12.datatypes.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip12.datatypes.jsligo new file mode 100644 index 0000000..fc351cb --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip12.datatypes.jsligo @@ -0,0 +1,105 @@ +/** + * Token-specific metadata is stored/presented as a Michelson value of type + * (map string bytes). A few of the keys are reserved and predefined by + * TZIP-012: + * + * + * "" (empty-string): should correspond to a TZIP-016 URI which points to a JSON + * representation of the token metadata. + * + * "name": should be a UTF-8 string giving a “display name” to the token. + * + * "symbol": should be a UTF-8 string for the short identifier of the token + * (e.g. XTZ, EUR, …). + * + * "decimals": should be an integer (converted to a UTF-8 string in decimal) + * which defines the position of the decimal point in token balances for display + * purposes. + * + * In the case of a TZIP-016 URI pointing to a JSON blob, the JSON preserves the + * same 3 reserved non-empty fields: + * { "symbol": , "name": , "decimals": , ... } + * Providing a value for "decimals" is required for all token types. "name" and "symbol" are not required but it is highly recommended for most tokens to provide the values either in the map or the JSON found via the TZIP-016 URI. + * Other standards such as TZIP-021 describe token metadata schemas which reserve additional keys for different token types for greater compatibility across indexers, wallets, and tooling. +**/ + +export type tokenMetadataData = { + token_id: nat, + token_info: map +}; + +/** +* Token metadata is intended for off-chain, user-facing contexts (e.g. wallets, +* explorers, marketplaces). An earlier (superseded) specification of TZIP-012 token metadata is +* contained in the Legacy Interface section of the Legacy FA2 document. +* There is one @see tokenMetadataData per token_id +**/ + +export type tokenMetadata = big_map; + +/** +* A partial transaction (ignoring the from field) +**/ + +export type atomic_trans = { to_: address, token_id: nat, amount: nat }; + +/** +* Some transaction from a common owner address but multiple destinations @see atomic_trans +**/ + +export type transfer_from = { from_: address, txs: list }; + +/** +* Transfer entrypoint parameter +* A batch of transaction represented by a list of @see transfer_from +**/ + +export type transfer = list; + +/** +* @see balance_of request +**/ + +export type request = { owner: address, token_id: nat }; + +/** +* A callback object is a response from a @see request with a balance +**/ + +export type callback = { request, balance: nat }; + +/** +* A default Main variant with a list of @see callback +**/ + +export type callback_param = | ["Main", list]; + +/** +* balance_of entrypoint parameter +* Batch a list of balance requests @see request and @see callback_param contract +**/ + +export type balance_of = { + requests: list, + callback: contract +}; + +/** +* Operator update +**/ + +export type operator = { owner: address, operator: address, token_id: nat }; + +/** +* Add or Remove token operators variant with an @see operator update +**/ + +export type unit_update = + ["Add_operator", operator] | ["Remove_operator", operator]; + +/** +* update_operators entrypoint parameter +* A list of @see unit_update for the specified token owners and token IDs +**/ + +export type update_operators = list; diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip12.interfaces.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip12.interfaces.jsligo new file mode 100644 index 0000000..4f7f272 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip12.interfaces.jsligo @@ -0,0 +1,191 @@ +#import "tzip12.datatypes.jsligo" "TZIP12Datatypes" + +#import "tzip16.datatypes.jsligo" "TZIP16Datatypes" + +export interface FA2 { + /** The ledger stores user<->token ownership + * @see storage.ledger + **/ + + type ledger; + /** A group of operators. An operator is a Tezos address that originates token transfer operation on behalf of the owner. + * @see storage.operators + **/ + + type operators; + /* Mandatory storage to be recognized as TZIP12 contract*/ + + type storage = { + extension: unit, + ledger: ledger, + operators: operators, + token_metadata: TZIP12Datatypes.tokenMetadata, + metadata: TZIP16Datatypes.metadata, + }; + type ret = [list, storage]; + /** + * Each transfer in the batch is specified between one source (from_) address and + * a list of destinations. Each transfer_destination specifies token type and the + * amount to be transferred from the source address to the destination (to_) address. + * + * FA2 does NOT specify an interface for mint and burn operations; however, if an + * FA2 token contract implements mint and burn operations, it SHOULD, when possible, + * enforce the same logic (core transfer behavior and transfer permission logic) + * applied to the token transfer operation. Mint and burn can be considered special + * cases of the transfer. Although, it is possible that mint and burn have more or + * less restrictive rules than the regular transfer. For instance, mint and burn + * operations may be invoked by a special privileged administrative address only. + * In this case, regular operator restrictions may not be applicable. + * + * Core Transfer Behavior + * FA2 token contracts MUST always implement this behavior. + * + * + * - Every transfer operation MUST happen atomically and in order. If at least one + * transfer in the batch cannot be completed, the whole transaction MUST fail, all + * token transfers MUST be reverted, and token balances MUST remain unchanged. + * + * + * - Each transfer in the batch MUST decrement token balance of the source (from_) + * address by the amount of the transfer and increment token balance of the destination + * (to_) address by the amount of the transfer. + * + * + * - If the transfer amount exceeds current token balance of the source address, + * the whole transfer operation MUST fail with the error mnemonic "FA2_INSUFFICIENT_BALANCE". + * + * + * - If the token owner does not hold any tokens of type token_id, the owner's balance + * is interpreted as zero. No token owner can have a negative balance. + * + * + * - The transfer MUST update token balances exactly as the operation + * parameters specify it. Transfer operations MUST NOT try to adjust transfer + * amounts or try to add/remove additional transfers like transaction fees. + * + * + * - Transfers of zero amount MUST be treated as normal transfers. + * + * + * - Transfers with the same address (from_ equals to_) MUST be treated as normal + * transfers. + * + * + * -If one of the specified token_ids is not defined within the FA2 contract, the + * entrypoint MUST fail with the error mnemonic "FA2_TOKEN_UNDEFINED". + * + * + * - Transfer implementations MUST apply transfer permission policy logic (either + * default transfer permission policy or + * customized one). + * If permission logic rejects a transfer, the whole operation MUST fail. + * + * + * - Core transfer behavior MAY be extended. If additional constraints on tokens + * transfer are required, FA2 token contract implementation MAY invoke additional + * permission policies. If the additional permission fails, the whole transfer + * operation MUST fail with a custom error mnemonic. + * + * + * + * Default Transfer Permission Policy + * + * + * - Token owner address MUST be able to perform a transfer of its own tokens (e. g. + * SENDER equals to from_ parameter in the transfer). + * + * + * - An operator (a Tezos address that performs token transfer operation on behalf + * of the owner) MUST be permitted to manage the specified owner's tokens before + * it invokes a transfer transaction (see update_operators). + * + * + * - If the address that invokes a transfer operation is neither a token owner nor + * one of the permitted operators, the transaction MUST fail with the error mnemonic + * "FA2_NOT_OPERATOR". If at least one of the transfers in the batch is not permitted, + * the whole transaction MUST fail. + * @param p : @see TZIP12Datatypes.transfer + * @param s : the storage + **/ + + @entry + const transfer: (p: TZIP12Datatypes.transfer, s: storage) => ret; + /** + * Gets the balance of multiple account/token pairs. Accepts a list of + * balance_of_requests and a callback contract callback which accepts a list of + * balance_of_response records. + * + * + * - There may be duplicate balance_of_request's, in which case they should not be + * deduplicated nor reordered. + * + * + * - If the account does not hold any tokens, the account + * balance is interpreted as zero. + * + * + * - If one of the specified token_ids is not defined within the FA2 contract, the + * entrypoint MUST fail with the error mnemonic "FA2_TOKEN_UNDEFINED". + * @param p : @see TZIP12Datatypes.balance_of + * @param s : the storage + **/ + + @entry + const balance_of: (p: TZIP12Datatypes.balance_of, s: storage) => ret; + /** + * Add or Remove token operators for the specified token owners and token IDs. + * + * + * - The entrypoint accepts a list of update_operator commands. If two different + * commands in the list add and remove an operator for the same token owner and + * token ID, the last command in the list MUST take effect. + * + * + * - It is possible to update operators for a token owner that does not hold any token + * balances yet. + * + * + * - Operator relation is not transitive. If C is an operator of B and if B is an + * operator of A, C cannot transfer tokens that are owned by A, on behalf of B. + * + * + * The standard does not specify who is permitted to update operators on behalf of + * the token owner. Depending on the business use case, the particular implementation + * of the FA2 contract MAY limit operator updates to a token owner (owner == SENDER) + * or be limited to an administrator. + * @param p : @see TZIP12Datatypes.update_operators + * @param s : the storage +**/ + + @entry + const update_operators: (p: TZIP12Datatypes.update_operators, s: storage) => ret; + /** OPTIONAL VIEWS **/ + //TODO waiting for next ligo feature : Interface optional fields to uncomment these lines + /** return the balance corresponding to the owner/token pair +**/ + + @view + const get_balance: (p: [address, nat], s: storage) => nat; + /** return to total number of tokens for the given token-id if known or fail if not. + **/ + + @view + const total_supply: (token_id: nat, s: storage) => nat; + /** returns the list of all the token IDs +**/ + + @view + const all_tokens: (_: unit, s: storage) => set; + /** return whether %operator is allowed to transfer %token_id tokens owned by owner + **/ + + @view + const is_operator: (op: TZIP12Datatypes.operator, s: storage) => bool; + /** It is one of the 2 ways of providing token-specific metadata, it +is defined in section Token Metadata and is not optional if +the contract does not have a %token_metadata big-map + **/ + + @view + const token_metadata: (p: nat, s: storage) => TZIP12Datatypes.tokenMetadataData; +}; diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip16.datatypes.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip16.datatypes.jsligo new file mode 100644 index 0000000..07634a5 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/common/tzip16.datatypes.jsligo @@ -0,0 +1,37 @@ +/** + * This file implement the TZIP-16 protocol (Contract Metadata) for Tezos + * defined here : https://gitlab.com/tezos/tzip/-/blob/master/proposals/tzip-16/tzip-16.md + * + * An FA2-compliant contract SHOULD provide contract-level metadata via TZIP-016: + * + * - If a contract does not contain the TZIP-016 %metadata big-map, it must provide token-specific-metadata through the %token_metadata big-map method described above in Token Metadata. + * + * The TZIP-016 contract metadata JSON structure is described below: + * + * + * - The TZIP-016 "interfaces" field MUST be present + * + * - It should contain "TZIP-012[-]" + * + * + * - version-info is an optional string extension, precising which version of + * this document is implemented by the contract (commit hash prefix, + * e.g. 6883675 or an RFC-3339 date, + * e.g. 2020-10-23). + * + * TZIP-016 : JSON nomenclature + * { + * "name":"", (* A single string, free format.It is recommended to have “name” strings help identifying the purpose of the contract. *) + * "description":"", (* A single string, free format.Preferably a set of proper natural language paragraphs. *) + * "version":"", (* A single string, free format. It is recommended to have version strings which attempt at uniquely identifying the exact Michelson contract, or at least its behavior, as a precision w.r.t the name field. Of course, none of that can be enforced. *) + * "license":{"name":"", "details":""}, (* An extensible object { "name": , "details" : }, "details" being optional. It is recommended to use de facto standard short names when possible, see the Debian guidelines for instance. *) + * "authors":[], (* A list of strings. Each author should obey the "Print Name <'contact'>", where the 'contact' string is either an email address, or a web URI. *) + * "homepage":"", (* A single string, representing a “web” URL (e.g. HTTPS). The homepage is for human-consumption, it may be the location of the source of the contract, how to submit issue tickets, or just a more elaborate description. *) + * "source":{"tools":[], "location":""}, (* An object { "tools": [], "location": } describing the source code which was transformed or generated the Michelson code of the contract. "tools" is an informal list of compilers/code-generators/libraries/post-processors used to generate the originated code, if possible with version information. The goal is to attempt to provide enough information for interested parties to reproduce the Michelson from its source, or at least to inspect it. *) + * "interfaces":[], (* A list of strings. Each string should allow the consumer of the metadata to know which interfaces and behaviors the contract claims to obey (other than the obvious TZIP-016). In the case of standards defined as TZIPs in the present repository, the string should obey the pattern "TZIP-" where is additional information prefixed with a space character. Example: an FA2 contract would (at least) have an "interfaces" field containing ["TZIP-012"] or ["TZIP-012 git 6544de32"]. *) + * "errors":[], (* A list of “error translation” objects, which allow one to interpret error values output by the contract using the FAILWITH instruction. The interpretation is a larger data-structure, for instance, to provide to a wallet-user with a more understandable error message to act on (usually a string or bytes natural language text value). They are either: *) + * "views":[] (* A list of off-chain-view objects, defined in the following section. *) + * } + **/ + +export type metadata = big_map; diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/extendable_nft.impl.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/extendable_nft.impl.jsligo new file mode 100644 index 0000000..15e11a0 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/extendable_nft.impl.jsligo @@ -0,0 +1,247 @@ +#import "../common/assertions.jsligo" "Assertions" + +#import "../common/errors.mligo" "Errors" + +#import "../common/tzip12.datatypes.jsligo" "TZIP12" + +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +export type ledger = big_map; + +export type operator = address; + +export type operators = big_map<[address, operator], set>; //[owner,operator] + + +export type storage = { + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata, + extension: T +}; + +type ret = [list, storage]; + +const make_storage = (extension) => + ( + { + ledger: Big_map.empty, + operators: Big_map.empty, + token_metadata: Big_map.empty, + metadata: Big_map.empty, + extension: extension + } + ) + +//** LIGOFA_NFT +export const assert_authorisation = ( + operators: operators, + from_: address, + token_id: nat +): unit => { + const sender_ = (Tezos.get_sender()); + if (sender_ != from_) { + const authorized = + match((Big_map.find_opt([from_, sender_], operators))) { + when (Some(a)): + a + when (None()): + Set.empty + }; + if (! (Set.mem(token_id, authorized))) { + return failwith(Errors.not_operator) + } + } else { + return unit + } +}; + +export const add_operator = ( + operators: operators, + owner: address, + operator: address, + token_id: nat +): operators => { + if (owner == operator) { + return operators + // assert_authorisation always allow the owner so this case is not relevant + } else { + Assertions.assert_update_permission(owner); + let auth_tokens = + match(Big_map.find_opt([owner, operator], operators)) { + when (Some(ts)): + ts + when (None()): + Set.empty + }; + auth_tokens = Set.add(token_id, auth_tokens); + return Big_map.update([owner, operator], Some(auth_tokens), operators) + } +}; + +export const remove_operator = ( + operators: operators, + owner: address, + operator: address, + token_id: nat +): operators => { + if (owner == operator) { + return operators + // assert_authorisation always allow the owner so this case is not relevant + } else { + Assertions.assert_update_permission(owner); + const auth_tokens: option> = + match(Big_map.find_opt([owner, operator], operators)) { + when (Some(ts)): + do { + const toks = Set.remove(token_id, ts); + if (Set.cardinal(toks) == 0n) { + return None() + } else { + return Some(toks) + } + } + when (None()): + None() + }; + return Big_map.update([owner, operator], auth_tokens, operators) + } +} + +// ledger +export const is_owner_of = (ledger: ledger, token_id: nat, owner: address): bool => { + const current_owner = Option.unopt(Big_map.find_opt(token_id, ledger)); + return (current_owner == owner) +}; + +export const assert_owner_of = (ledger: ledger, token_id: nat, owner: address): unit => + assert_with_error(is_owner_of(ledger, token_id, owner), Errors.ins_balance); + +export const transfer_token_from_user_to_user = ( + ledger: ledger, + token_id: nat, + from_: address, + to_: address +): ledger => { + assert_owner_of(ledger, token_id, from_); + return Big_map.update(token_id, Some(to_), ledger) +} + +export const set_ledger = ([s, ledger]: [storage, ledger]): storage => + ({ ...s, ledger: ledger }); + +export const get_operators = (s: storage): operators => s.operators; + +export const set_operators = ([s, operators]: [storage, operators]): storage< + T +> => + ({ ...s, operators: operators }) + +//** TZIP12Interface.FA2 +// operators +/** +* Check if the intented transfer is sent from the same sender as from field, otherwise check if the sender is part of the operator authorized to receive this token +* @param operators : operator bigmap +* @param from_ : transfer from address +* @param token_id : token_id to test +*/ +export const transfer = (t: TZIP12.transfer, s: storage): ret => { + const process_atomic_transfer = (from_: address) => + ([ledger, t]: [ledger, TZIP12.atomic_trans]): ledger => { + const { to_, token_id, amount } = t; + ignore(amount); + Assertions.assert_token_exist(s.token_metadata, token_id); + assert_authorisation(s.operators, from_, token_id); + return transfer_token_from_user_to_user(ledger, token_id, from_, to_) + }; + const process_single_transfer = ([ledger, t]: [ledger, TZIP12.transfer_from]): ledger => { + const { from_, txs } = t; + return List.fold_left(process_atomic_transfer(from_), ledger, txs) + }; + const ledger = List.fold_left(process_single_transfer, s.ledger, t); + const store = set_ledger([s, ledger]); + return [list([]), store] +}; + +export const balance_of = (b: TZIP12.balance_of, s: storage): ret => { + const { requests, callback } = b; + const get_balance_info = (request: TZIP12.request): TZIP12.callback => { + const { owner, token_id } = request; + Assertions.assert_token_exist(s.token_metadata, token_id); + let balance_ = 0 as nat; + if (is_owner_of(s.ledger, token_id, owner)) balance_ = 1 as nat; + return ({ request: request, balance: balance_ }) + }; + const callback_param = List.map(get_balance_info, requests); + const operation = Tezos.transaction(Main(callback_param), 0mutez, callback); + return [list([operation]), s] +}; + +export const update_operators = ( + updates: TZIP12.update_operators, + s: storage +): ret => { + const update_operator = ( + [operators, update]: [operators, TZIP12.unit_update] + ): operators => + match(update) { + when (Add_operator(operator)): + add_operator( + operators, + operator.owner, + operator.operator, + operator.token_id + ) + when (Remove_operator(operator)): + remove_operator( + operators, + operator.owner, + operator.operator, + operator.token_id + ) + }; + let operators = get_operators(s); + operators = List.fold_left(update_operator, operators, updates); + const store = set_operators([s, operators]); + return [list([]), store] +}; + +export const get_balance = (p: [address, nat], s: storage): nat => { + const [owner, token_id] = p; + Assertions.assert_token_exist(s.token_metadata, token_id); + if (is_owner_of(s.ledger, token_id, owner)) { + return 1n + } else { + return 0n + } +}; + +export const total_supply = (token_id: nat, s: storage): nat => { + Assertions.assert_token_exist(s.token_metadata, token_id); + return 1n +}; + +export const all_tokens = (_: unit, _s: storage): set => + failwith(Errors.not_available); + +export const is_operator = (op: TZIP12.operator, s: storage): bool => { + const authorized = + match(Big_map.find_opt([op.owner, op.operator], s.operators)) { + when (Some(a)): + a + when (None()): + Set.empty + }; + return (Set.mem(op.token_id, authorized) || op.owner == op.operator) +}; + +export const token_metadata = (p: nat, s: storage): TZIP12. +tokenMetadataData => { + return match(Big_map.find_opt(p, s.token_metadata)) { + when (Some(data)): + data + when (None()): + failwith(Errors.undefined_token) + } +} diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/extendable_nft.impl.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/extendable_nft.impl.mligo new file mode 100644 index 0000000..a4cf847 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/extendable_nft.impl.mligo @@ -0,0 +1,228 @@ +#import "../common/assertions.jsligo" "Assertions" +#import "../common/errors.mligo" "Errors" +#import "../common/tzip12.datatypes.jsligo" "TZIP12" +#import "../common/tzip12.interfaces.jsligo" "TZIP12Interface" +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +type ledger = (nat, address) big_map + +type operator = address + +type operators = ((address * operator), nat set) big_map + +type 'a storage = + { + extension : 'a; + ledger : ledger; + operators : operators; + token_metadata : TZIP12.tokenMetadata; + metadata : TZIP16.metadata + } + +type 'a ret = operation list * 'a storage + +let make_storage (type a) (extension : a) : a storage = + { + ledger = Big_map.empty; + operators = Big_map.empty; + token_metadata = Big_map.empty; + metadata = Big_map.empty; + extension = extension + } + +// Operators +let assert_authorisation + (operators : operators) + (from_ : address) + (token_id : nat) +: unit = + let sender_ = (Tezos.get_sender ()) in + if (sender_ = from_) + then () + else + let authorized = + match Big_map.find_opt (from_, sender_) operators with + Some (a) -> a + | None -> Set.empty in + if Set.mem token_id authorized then () else failwith Errors.not_operator + +let is_operator + (operators, owner, operator, token_id : (operators * address * address * nat)) +: bool = + let authorized = + match Big_map.find_opt (owner, operator) operators with + Some (a) -> a + | None -> Set.empty in + (owner = operator || Set.mem token_id authorized) + +let add_operator + (operators : operators) + (owner : address) + (operator : operator) + (token_id : nat) +: operators = + if owner = operator + then operators + (* assert_authorisation always allow the owner so this case is not relevant *) + else + let () = Assertions.assert_update_permission owner in + let auth_tokens = + match Big_map.find_opt (owner, operator) operators with + Some (ts) -> ts + | None -> Set.empty in + let auth_tokens = Set.add token_id auth_tokens in + Big_map.update (owner, operator) (Some auth_tokens) operators + +let remove_operator + (operators : operators) + (owner : address) + (operator : operator) + (token_id : nat) +: operators = + if owner = operator + then operators + (* assert_authorisation always allow the owner so this case is not relevant *) + else + let () = Assertions.assert_update_permission owner in + let auth_tokens = + match Big_map.find_opt (owner, operator) operators with + None -> None + | Some (ts) -> + let ts = Set.remove token_id ts in + [@no_mutation] + let is_empty = Set.size ts = 0n in + if is_empty then None else Some (ts) in + Big_map.update (owner, operator) auth_tokens operators + +//module Ledger = struct +let is_owner_of (ledger : ledger) (token_id : nat) (owner : address) : bool = + let current_owner = Option.unopt (Big_map.find_opt token_id ledger) in + current_owner = owner + +let assert_owner_of (ledger : ledger) (token_id : nat) (owner : address) : unit = + assert_with_error (is_owner_of ledger token_id owner) Errors.ins_balance + +let transfer_token_from_user_to_user + (ledger : ledger) + (token_id : nat) + (from_ : address) + (to_ : address) +: ledger = + let () = assert_owner_of ledger token_id from_ in + let ledger = Big_map.update token_id (Some to_) ledger in + ledger + +//module Storage = struct +let is_owner_of (type a) (s : a storage) (owner : address) (token_id : nat) +: bool = is_owner_of s.ledger token_id owner + +let set_ledger (type a) (s : a storage) (ledger : ledger) = + {s with ledger = ledger} + +let get_operators (type a) (s : a storage) = s.operators + +let set_operators (type a) (s : a storage) (operators : operators) = + {s with operators = operators} + +let get_balance (type a) (s : a storage) (owner : address) (token_id : nat) +: nat = + let () = Assertions.assert_token_exist s.token_metadata token_id in + if is_owner_of s owner token_id then 1n else 0n + +let set_balance (type a) (s : a storage) (owner : address) (token_id : nat) +: a storage = + let () = Assertions.assert_token_exist s.token_metadata token_id in + let new_ledger = Big_map.update token_id (Some owner) s.ledger in + set_ledger s new_ledger + +let transfer (type a) (t : TZIP12.transfer) (s : a storage) : a ret = + (* This function process the "txs" list. Since all transfer share the same "from_" address, we use a se *) + let process_atomic_transfer + (from_ : address) + (ledger, t : ledger * TZIP12.atomic_trans) = + let { + to_; + token_id; + amount = _ + } = t in + let () = Assertions.assert_token_exist s.token_metadata token_id in + let () = assert_authorisation s.operators from_ token_id in + let ledger = transfer_token_from_user_to_user ledger token_id from_ to_ in + ledger in + let process_single_transfer (ledger, t : ledger * TZIP12.transfer_from) = + let { + from_; + txs + } = t in + let ledger = List.fold_left (process_atomic_transfer from_) ledger txs in + ledger in + let ledger = List.fold_left process_single_transfer s.ledger t in + let s = set_ledger s ledger in + ([] : operation list), s + +let balance_of (type a) (b : TZIP12.balance_of) (s : a storage) : a ret = + let { + requests; + callback + } = b in + let get_balance_info (request : TZIP12.request) : TZIP12.callback = + let { + owner; + token_id + } = request in + let balance_ = get_balance s owner token_id in + { + request = request; + balance = balance_ + } in + let callback_param = List.map get_balance_info requests in + let operation = Tezos.transaction (Main callback_param) 0mutez callback in + ([operation] : operation list), s + +let update_operators (type a) + (updates : TZIP12.update_operators) + (s : a storage) +: a ret = + let update_operator (operators, update : operators * TZIP12.unit_update) = + match update with + Add_operator + { + owner = owner; + operator = operator; + token_id = token_id + } -> add_operator operators owner operator token_id + | Remove_operator + { + owner = owner; + operator = operator; + token_id = token_id + } -> remove_operator operators owner operator token_id in + let operators = get_operators s in + let operators = List.fold_left update_operator operators updates in + let s = set_operators s operators in + ([] : operation list), s + +let get_balance (type a) (p : address * nat) (s : a storage) = + let (owner, token_id) = p in + let balance_ = get_balance s owner token_id in + balance_ + +(* FIXME? Dynamic supply *) +let total_supply (type a) (token_id : nat) (s : a storage) = + let () = Assertions.assert_token_exist s.token_metadata token_id in + 1n + +let all_tokens (type a) (() : unit) (_s : a storage) : nat set = + failwith Errors.not_available + +let is_operator (type a) (op : TZIP12.operator) (s : a storage) : bool = + let authorized = + match Big_map.find_opt (op.owner, op.operator) s.operators with + Some (opSet) -> opSet + | None -> Set.empty in + Set.size authorized > 0n || op.owner = op.operator + +let token_metadata (type a) (p : nat) (s : a storage) : TZIP12.tokenMetadataData = + match Big_map.find_opt p s.token_metadata with + Some (data) -> data + | None () -> failwith Errors.undefined_token diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/nft.impl.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/nft.impl.jsligo new file mode 100644 index 0000000..b4955b8 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/nft.impl.jsligo @@ -0,0 +1,85 @@ +#import "../common/assertions.jsligo" "Assertions" + +#import "../common/errors.mligo" "Errors" + +#import "../common/tzip12.datatypes.jsligo" "TZIP12" + +#import "../common/tzip16.datatypes.jsligo" "TZIP16" + +#import "./extendable_nft.impl.jsligo" "NFTExtendable" + +export type ledger = NFTExtendable.ledger; + +export type operator = NFTExtendable.operator; + +export type operators = NFTExtendable.operators; + +export type storage = { + ledger: ledger, + operators: operators, + token_metadata: TZIP12.tokenMetadata, + metadata: TZIP16.metadata, +} + +type ret = [list, storage]; + +const empty_storage: storage = { + ledger: Big_map.empty, + operators: Big_map.empty, + token_metadata: Big_map.empty, + metadata: Big_map.empty +} + +@inline +const lift = (s: storage): NFTExtendable.storage => { + return { + extension: unit, + ledger: s.ledger, + operators: s.operators, + token_metadata: s.token_metadata, + metadata: s.metadata + }; +} + +@inline +const unlift = ([ops, s]: [list, NFTExtendable.storage]): ret => { + let storage = { + ledger: s.ledger, + operators: s.operators, + token_metadata: s.token_metadata, + metadata: s.metadata + }; + return [ops, storage]; +} + +@entry +const transfer = (t: TZIP12.transfer, s: storage): ret => + unlift(NFTExtendable.transfer(t, lift(s))) + +@entry +const balance_of = (b: TZIP12.balance_of, s: storage): ret => + unlift(NFTExtendable.balance_of(b, lift(s))) + +@entry +const update_operators = (updates: TZIP12.update_operators, s: storage): ret => + unlift(NFTExtendable.update_operators(updates, lift(s))) + +@view +const get_balance = (p: [address, nat], s: storage): nat => + NFTExtendable.get_balance(p, lift(s)) + +@view +const total_supply = (token_id: nat, s: storage): nat => + NFTExtendable.total_supply(token_id, lift(s)) + +@view +const all_tokens = (_: unit, s: storage): set => + NFTExtendable.all_tokens(unit, lift(s)) + +@view +const is_operator = (op: TZIP12.operator, s: storage): bool => + NFTExtendable.is_operator(op, lift(s)) + +@view +const token_metadata = (p: nat, s: storage): TZIP12.tokenMetadataData => + NFTExtendable.token_metadata(p, lift(s)) diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/nft.impl.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/nft.impl.mligo new file mode 100644 index 0000000..c98b998 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/fa2/nft/nft.impl.mligo @@ -0,0 +1,83 @@ +#import "../common/assertions.jsligo" "Assertions" +#import "../common/errors.mligo" "Errors" +#import "../common/tzip12.datatypes.jsligo" "TZIP12" +#import "../common/tzip12.interfaces.jsligo" "TZIP12Interface" +#import "../common/tzip16.datatypes.jsligo" "TZIP16" +#import "./extendable_nft.impl.mligo" "NFTExtendable" + +type ledger = NFTExtendable.ledger + +type operator = NFTExtendable.operator + +type operators = NFTExtendable.operators + +type storage = + { + ledger : ledger; + operators : operators; + token_metadata : TZIP12.tokenMetadata; + metadata : TZIP16.metadata + } + +type ret = operation list * storage + +let empty_storage : storage = + { + ledger = Big_map.empty; + operators = Big_map.empty; + token_metadata = Big_map.empty; + metadata = Big_map.empty + } + +[@inline] +let lift (s : storage) : unit NFTExtendable.storage = + { + ledger = s.ledger; + operators = s.operators; + token_metadata = s.token_metadata; + metadata = s.metadata; + extension = () + } + +[@inline] +let unlift (ret : operation list * unit NFTExtendable.storage) : ret = + let ops, s = ret in + ops, + { + ledger = s.ledger; + operators = s.operators; + token_metadata = s.token_metadata; + metadata = s.metadata + } + +[@entry] +let transfer (t : TZIP12.transfer) (s : storage) : ret = + unlift (NFTExtendable.transfer t (lift s)) + +[@entry] +let balance_of (b : TZIP12.balance_of) (s : storage) : ret = + unlift (NFTExtendable.balance_of b (lift s)) + +[@entry] +let update_operators (updates : TZIP12.update_operators) (s : storage) : ret = + unlift (NFTExtendable.update_operators updates (lift s)) + +[@view] +let get_balance (p : (address * nat)) (s : storage) : nat = + NFTExtendable.get_balance p (lift s) + +[@view] +let total_supply (token_id : nat) (s : storage) : nat = + NFTExtendable.total_supply token_id (lift s) + +[@view] +let all_tokens (_ : unit) (s : storage) : nat set = + NFTExtendable.all_tokens () (lift s) + +[@view] +let is_operator (op : TZIP12.operator) (s : storage) : bool = + NFTExtendable.is_operator op (lift s) + +[@view] +let token_metadata (p : nat) (s : storage) : TZIP12.tokenMetadataData = + NFTExtendable.token_metadata p (lift s) diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/main.jsligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/main.jsligo new file mode 100644 index 0000000..d30b0b8 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/main.jsligo @@ -0,0 +1,11 @@ +// An implementaion of FA2 Interface (TZIP-12) for NFT +#import "./fa2/nft/nft.impl.jsligo" "NFT" +#import "./fa2/nft/extendable_nft.impl.jsligo" "NFTExtendable" + +// An implementaion of FA2 Interface (TZIP-12) for a Single Asset Token +#import "./fa2/asset/single_asset.impl.jsligo" "SingleAsset" +#import "./fa2/asset/extendable_single_asset.impl.jsligo" "SingleAssetExtendable" + +// An implementaion of FA2 Interface (TZIP-12) for a Multi Asset Token +#import "./fa2/asset/multi_asset.impl.jsligo" "MultiAsset" +#import "./fa2/asset/extendable_multi_asset.impl.jsligo" "MultiAssetExtendable" diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/main.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/main.mligo new file mode 100644 index 0000000..69f5e77 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/lib/main.mligo @@ -0,0 +1,11 @@ +(* An implementaion of FA2 Interface (TZIP-12) for NFT *) +#import "./fa2/nft/nft.impl.mligo" "NFT" +#import "./fa2/nft/extendable_nft.impl.mligo" "NFTExtendable" + +(* An implementaion of FA2 Interface (TZIP-12) for a Single Asset Token *) +#import "./fa2/asset/single_asset.impl.mligo" "SingleAsset" +#import "./fa2/asset/extendable_single_asset.impl.mligo" "SingleAssetExtendable" + +(* An implementaion of FA2 Interface (TZIP-12) for a Multi Asset Token *) +#import "./fa2/asset/multi_asset.impl.mligo" "MultiAsset" +#import "./fa2/asset/extendable_multi_asset.impl.mligo" "MultiAssetExtendable" diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/ligo.json b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/ligo.json new file mode 100644 index 0000000..3bb92fa --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/ligo.json @@ -0,0 +1,21 @@ +{ + "name": "@ligo/fa", + "version": "1.1.1", + "description": "FA2 interface and types compliant with TZIP12. The library is also providing 3 Ligo contract implementations for nft, single asset & multi asset contracts", + "directories": { + "lib": "lib", + "test": "test" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/ligolang/contract-catalogue.git" + }, + "main": "lib/main.mligo", + "keywords": ["ligo", "ligo@^1.2.0", "tezos", "jsligo", "cameligo", "nft"], + "author": "ligoLANG ", + "license": "MIT", + "bugs": { + "url": "https://github.com/ligolang/contract-catalogue/issues" + }, + "homepage": "https://github.com/ligolang/contract-catalogue#readme" +} diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/balance_of_callback_contract.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/balance_of_callback_contract.mligo new file mode 100644 index 0000000..933879b --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/balance_of_callback_contract.mligo @@ -0,0 +1,18 @@ +type storage = nat list + +type request = { + owner : address; + token_id : nat; +} + +type callback = { + request : request; + balance : nat; +} + +type parameter = callback list + +[@entry] +let main (responses : parameter) (_ : storage) = + let balances = List.map (fun (r : callback) -> r.balance) responses in + ([]: operation list), balances \ No newline at end of file diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/multi_asset.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/multi_asset.test.mligo new file mode 100644 index 0000000..48c4c33 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/multi_asset.test.mligo @@ -0,0 +1,387 @@ +#import "../../lib/fa2/asset/multi_asset.impl.mligo" "FA2_multi_asset" +#import "./balance_of_callback_contract.mligo" "Callback" + +(* Tests for FA2 multi asset contract *) + +module List_helper = struct + + let nth_exn (type a) (i: int) (a: a list) : a = + let rec aux (remaining: a list) (cur: int) : a = + match remaining with + [] -> + failwith "Not found in list" + | hd :: tl -> + if cur = i then + hd + else aux tl (cur + 1) + in + aux a 0 + +end + +let get_initial_storage (a, b, c : nat * nat * nat) = + let () = Test.reset_state 6n ([] : tez list) in + + let owner1 = Test.nth_bootstrap_account 0 in + let owner2 = Test.nth_bootstrap_account 1 in + let owner3 = Test.nth_bootstrap_account 2 in + + let owners = [owner1; owner2; owner3] in + + let op1 = Test.nth_bootstrap_account 3 in + let op2 = Test.nth_bootstrap_account 4 in + let op3 = Test.nth_bootstrap_account 5 in + + let ops = [op1; op2; op3] in + + let ledger = Big_map.literal ([ + ((owner1, 1n), a); + ((owner2, 2n), b); + ((owner3, 3n), c); + ((owner1, 2n), a); + ]) + in + + let operators = Big_map.literal ([ + ((owner1, op1), Set.literal [1n; 2n]); + ((owner2, op1), Set.literal [2n]); + ((owner3, op1), Set.literal [3n]); + ((op1 , op3), Set.literal [2n]); + ]) + in + + let token_metadata = (Big_map.literal [ + (1n, ({token_id=1n;token_info=(Map.empty : (string, bytes) map);} : FA2_multi_asset.TZIP12.tokenMetadataData)); + (2n, ({token_id=2n;token_info=(Map.empty : (string, bytes) map);} : FA2_multi_asset.TZIP12.tokenMetadataData)); + (3n, ({token_id=3n;token_info=(Map.empty : (string, bytes) map);} : FA2_multi_asset.TZIP12.tokenMetadataData)); + ] : FA2_multi_asset.TZIP12.tokenMetadata) in + + + let metadata =Big_map.literal [ + ("", [%bytes {|tezos-storage:data|}]); + ("data", [%bytes +{|{ + "name":"FA2", + "description":"Example FA2 implementation", + "version":"0.1.0", + "license":{"name":"MIT"}, + "authors":["Benjamin Fuentes"], + "homepage":"", + "source":{"tools":["Ligo"], "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors":[], + "views":[] + +}|}]); +] in + + + let initial_storage : FA2_multi_asset.storage = { + ledger = ledger; + token_metadata = token_metadata; + operators = operators; + metadata = metadata; + } in + + initial_storage, owners, ops + + +let assert_balances + (contract_address : (FA2_multi_asset parameter_of, FA2_multi_asset.storage) typed_address ) + (a, b, c : (address * nat * nat) * (address * nat * nat) * (address * nat * nat)) = + let (owner1, token_id_1, balance1) = a in + let (owner2, token_id_2, balance2) = b in + let (owner3, token_id_3, balance3) = c in + let storage = Test.get_storage contract_address in + let ledger = storage.ledger in + let () = match (Big_map.find_opt (owner1, token_id_1) ledger) with + Some amt -> assert (amt = balance1) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt (owner2, token_id_2) ledger) with + Some amt -> assert (amt = balance2) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt (owner3, token_id_3) ledger) with + Some amt -> assert (amt = balance3) + | None -> failwith "incorret address" + in + () + + +(* Transfer *) + +(* 1. transfer successful *) +let test_atomic_transfer_success = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 2n, 8n), (owner2, 2n, 12n), (owner3, 3n, 10n)) in + () + +(* 2. transfer failure token undefined *) +let test_transfer_token_undefined = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=1n};{to_=owner3;amount=3n;token_id=2n}] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;amount=2n;token_id=0n};{to_=owner1;amount=3n;token_id=2n}] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.undefined_token)) + | Fail _ -> failwith "invalid test failure" + +(* 3. transfer failure incorrect operator *) +let test_atomic_transfer_failure_not_operator = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 4. transfer failure insuffient balance *) +let test_atomic_transfer_failure_not_suffient_balance = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=12n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.ins_balance)) + | Fail _ -> failwith "invalid test failure" + +(* 5. transfer successful 0 amount & self transfer *) +let test_atomic_transfer_success_zero_amount_and_self_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=0n;token_id=1n};{to_=owner3;amount=0n;token_id=1n}] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 1n, 10n), (owner2, 2n, 10n), (owner3, 3n, 10n)) in + () + +(* 6. transfer failure transitive operators *) +let test_transfer_failure_transitive_operators = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner3; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* Balance of *) + +(* 7. empty balance of + callback with empty response *) +let test_empty_transfer_and_balance_of = + let initial_storage, _owners, _operators = get_initial_storage (10n, 10n, 10n) in + let orig_callback= Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([] : nat list)) + +(* 8. balance of failure token undefined *) +let test_balance_of_token_undefines = + let initial_storage, owners, _operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let orig_callback= Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + ] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Balance_of balance_of_requests) 0tez in + + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.undefined_token)) + | Fail _ -> failwith "invalid test failure" + +(* 9. duplicate balance_of requests *) +let test_balance_of_requests_with_duplicates = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let _op1 = List_helper.nth_exn 0 operators in + let orig_callback= Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + ] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 10n])) + +(* 10. 0 balance if does not hold any tokens (not in ledger) *) +let test_balance_of_0_balance_if_address_does_not_hold_tokens = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig_callback= Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=op1;token_id=1n}; + ] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 0n])) + + +(* Update operators *) + +(* 11. Remove operator & do transfer - failure *) +let test_update_operator_remove_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner1; + operator = op1; + token_id = 2n; + } : FA2_multi_asset.TZIP12.operator) : FA2_multi_asset.TZIP12.unit_update) + ] : FA2_multi_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op1 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 12. Add operator & do transfer - success *) +let test_update_operator_add_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 2n; + } : FA2_multi_asset.TZIP12.operator) : FA2_multi_asset.TZIP12.unit_update); + ] : FA2_multi_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + () diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/multi_asset_jsligo.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/multi_asset_jsligo.test.mligo new file mode 100644 index 0000000..106a331 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/multi_asset_jsligo.test.mligo @@ -0,0 +1,387 @@ +#import "../../lib/fa2/asset/multi_asset.impl.jsligo" "FA2_multi_asset" + +#import "./balance_of_callback_contract.mligo" "Callback" + +(* Tests for FA2 multi asset contract *) + +module List_helper = struct + + let nth_exn (type a) (i: int) (a: a list) : a = + let rec aux (remaining: a list) (cur: int) : a = + match remaining with + [] -> + failwith "Not found in list" + | hd :: tl -> + if cur = i then + hd + else aux tl (cur + 1) + in + aux a 0 + +end + +let get_initial_storage (a, b, c : nat * nat * nat) = + let () = Test.reset_state 6n ([] : tez list) in + + let owner1 = Test.nth_bootstrap_account 0 in + let owner2 = Test.nth_bootstrap_account 1 in + let owner3 = Test.nth_bootstrap_account 2 in + + let owners = [owner1; owner2; owner3] in + + let op1 = Test.nth_bootstrap_account 3 in + let op2 = Test.nth_bootstrap_account 4 in + let op3 = Test.nth_bootstrap_account 5 in + + let ops = [op1; op2; op3] in + + let ledger = Big_map.literal ([ + ((owner1, 1n), a); + ((owner2, 2n), b); + ((owner3, 3n), c); + ((owner1, 2n), a); + ]) + in + + let operators = Big_map.literal ([ + ((owner1, op1), Set.literal [1n; 2n]); + ((owner2, op1), Set.literal [2n]); + ((owner3, op1), Set.literal [3n]); + ((op1 , op3), Set.literal [2n]); + ]) + in + + let token_metadata = (Big_map.literal [ + (1n, ({token_id=1n;token_info=(Map.empty : (string, bytes) map);} : FA2_multi_asset.TZIP12.tokenMetadataData)); + (2n, ({token_id=2n;token_info=(Map.empty : (string, bytes) map);} : FA2_multi_asset.TZIP12.tokenMetadataData)); + (3n, ({token_id=3n;token_info=(Map.empty : (string, bytes) map);} : FA2_multi_asset.TZIP12.tokenMetadataData)); + ] : FA2_multi_asset.TZIP12.tokenMetadata) in + + + let metadata =Big_map.literal [ + ("", [%bytes {|tezos-storage:data|}]); + ("data", [%bytes +{|{ + "name":"FA2", + "description":"Example FA2 implementation", + "version":"0.1.0", + "license":{"name":"MIT"}, + "authors":["Benjamin Fuentes"], + "homepage":"", + "source":{"tools":["Ligo"], "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors":[], + "views":[] + +}|}]); +] in + + let initial_storage : FA2_multi_asset.storage = { + ledger = ledger; + token_metadata = token_metadata; + operators = operators; + metadata = metadata; + } in + + initial_storage, owners, ops + + +let assert_balances + (contract_address : (FA2_multi_asset parameter_of, FA2_multi_asset.storage) typed_address ) + (a, b, c : (address * nat * nat) * (address * nat * nat) * (address * nat * nat)) = + let (owner1, token_id_1, balance1) = a in + let (owner2, token_id_2, balance2) = b in + let (owner3, token_id_3, balance3) = c in + let storage = Test.get_storage contract_address in + let ledger = storage.ledger in + let () = match (Big_map.find_opt (owner1, token_id_1) ledger) with + Some amt -> assert (amt = balance1) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt (owner2, token_id_2) ledger) with + Some amt -> assert (amt = balance2) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt (owner3, token_id_3) ledger) with + Some amt -> assert (amt = balance3) + | None -> failwith "incorret address" + in + () + + +(* Transfer *) + +(* 1. transfer successful *) +let test_atomic_transfer_success = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n}] : FA2_multi_asset.TZIP12.atomic_trans list)} ); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 2n, 8n), (owner2, 2n, 12n), (owner3, 3n, 10n)) in + () + +(* 2. transfer failure token undefined *) +let test_transfer_token_undefined = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=1n};{to_=owner3;amount=3n;token_id=2n}] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;amount=2n;token_id=0n};{to_=owner1;amount=3n;token_id=2n}] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.undefined_token)) + | Fail _ -> failwith "invalid test failure" + +(* 3. transfer failure incorrect operator *) +let test_atomic_transfer_failure_not_operator = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 4. transfer failure insuffient balance *) +let test_atomic_transfer_failure_not_suffient_balance = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=12n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.ins_balance)) + | Fail _ -> failwith "invalid test failure" + +(* 5. transfer successful 0 amount & self transfer *) +let test_atomic_transfer_success_zero_amount_and_self_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=0n;token_id=1n};{to_=owner3;amount=0n;token_id=1n}] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 1n, 10n), (owner2, 2n, 10n), (owner3, 3n, 10n)) in + () + +(* 6. transfer failure transitive operators *) +let test_transfer_failure_transitive_operators = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner3; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* Balance of *) + +(* 7. empty balance of + callback with empty response *) +let test_empty_transfer_and_balance_of = + let initial_storage, _owners, _operators = get_initial_storage (10n, 10n, 10n) in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([] : nat list)) + +(* 8. balance of failure token undefined *) +let test_balance_of_token_undefines = + let initial_storage, owners, _operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + ] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Balance_of balance_of_requests) 0tez in + + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.undefined_token)) + | Fail _ -> failwith "invalid test failure" + +(* 9. duplicate balance_of requests *) +let test_balance_of_requests_with_duplicates = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let _op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + ] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 10n])) + +(* 10. 0 balance if does not hold any tokens (not in ledger) *) +let test_balance_of_0_balance_if_address_does_not_hold_tokens = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=op1;token_id=1n}; + ] : FA2_multi_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_multi_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 0n])) + + +(* Update operators *) + +(* 11. Remove operator & do transfer - failure *) +let test_update_operator_remove_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner1; + operator = op1; + token_id = 2n; + } : FA2_multi_asset.TZIP12.operator) : FA2_multi_asset.TZIP12.unit_update) + ] : FA2_multi_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op1 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_multi_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 12. Add operator & do transfer - success *) +let test_update_operator_add_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate (contract_of FA2_multi_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 2n; + } : FA2_multi_asset.TZIP12.operator) : FA2_multi_asset.TZIP12.unit_update); + ] : FA2_multi_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;amount=2n;token_id=2n};] : FA2_multi_asset.TZIP12.atomic_trans list)}); + ] : FA2_multi_asset.TZIP12.transfer) + in + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + () diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/e2e_mutation.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/e2e_mutation.test.mligo new file mode 100644 index 0000000..8506a8b --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/e2e_mutation.test.mligo @@ -0,0 +1,39 @@ +#import "../../../lib/fa2/nft/nft.impl.mligo" "FA2_NFT" +#import "./nft.test.mligo" "Test_FA2_NFT" + +let originate_and_test_e2e contract = + let () = Test_FA2_NFT._test_atomic_transfer_operator_success contract in + let () = Test_FA2_NFT._test_atomic_transfer_owner_success contract in + let () = Test_FA2_NFT._test_transfer_token_undefined contract in + let () = Test_FA2_NFT._test_atomic_transfer_failure_not_operator contract in + let () = + Test_FA2_NFT._test_atomic_transfer_success_zero_amount_and_self_transfer + contract in + let () = Test_FA2_NFT._test_transfer_failure_transitive_operators contract in + let () = Test_FA2_NFT._test_empty_transfer_and_balance_of contract in + let () = Test_FA2_NFT._test_balance_of_token_undefines contract in + let () = Test_FA2_NFT._test_balance_of_requests_with_duplicates contract in + let () = + Test_FA2_NFT._test_balance_of_0_balance_if_address_does_not_hold_tokens + contract in + let () = + Test_FA2_NFT._test_update_operator_remove_operator_and_transfer contract in + let () = Test_FA2_NFT._test_update_operator_add_operator_and_transfer contract in + let () = Test_FA2_NFT._test_only_sender_manage_operators contract in + let () = + Test_FA2_NFT._test_update_operator_remove_operator_and_transfer1 contract in + let () = + Test_FA2_NFT._test_update_operator_add_operator_and_transfer1 contract in + () + +let test_mutation = + match Test.mutation_test_all (contract_of FA2_NFT.NFT) originate_and_test_e2e + with + [] -> () + | ms -> + let () = + List.iter + (fun ((_, mutation) : unit * mutation) -> let () = Test.log mutation in + ()) + ms in + Test.failwith "Some mutation also passes the tests! ^^" diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/nft.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/nft.test.mligo new file mode 100644 index 0000000..0366133 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/nft.test.mligo @@ -0,0 +1,387 @@ +#import "../../../lib/fa2/nft/nft.impl.mligo" "FA2_NFT" +#import "../balance_of_callback_contract.mligo" "Callback" +#import "../../helpers/list.mligo" "List_helper" +#import "../../helpers/nft_helpers.mligo" "TestHelpers" + +(* Tests for FA2 multi asset contract *) + + +type fa2_nft = (FA2_NFT parameter_of, FA2_NFT.storage) module_contract + + +(* Transfer *) + +(* 1. transfer successful *) +let _test_atomic_transfer_operator_success (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate contract initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = TestHelpers.assert_balances orig.addr ((owner2, 1n), (owner2, 2n), (owner3, 3n)) in + () + +let test_atomic_transfer_operator_success = _test_atomic_transfer_operator_success (contract_of FA2_NFT) + + +(* 1.1. transfer successful owner *) +let _test_atomic_transfer_owner_success (contract: fa2_nft) = + let initial_storage, owners, _ = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source owner1 in + let orig = Test.originate contract initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = TestHelpers.assert_balances orig.addr ((owner2, 1n), (owner2, 2n), (owner3, 3n)) in + () + +let test_atomic_transfer_owner_success = _test_atomic_transfer_owner_success (contract_of FA2_NFT) + + +(* 2. transfer failure token undefined *) +let _test_transfer_token_undefined (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=15n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate contract initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.undefined_token + +let test_transfer_token_undefined = _test_transfer_token_undefined (contract_of FA2_NFT) + + +(* 3. transfer failure incorrect operator *) +let _test_atomic_transfer_failure_not_operator (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op2 = List_helper.nth_exn 1 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op2 in + let orig = Test.originate contract initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.not_operator +let test_atomic_transfer_failure_not_operator + + = _test_atomic_transfer_failure_not_operator (contract_of FA2_NFT) + +(* 4. self transfer *) +let _test_atomic_transfer_success_zero_amount_and_self_transfer (contract: fa2_nft) = + let initial_storage, owners, _operators = TestHelpers.get_initial_storage () in + + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let transfer_requests = ([ + ({from_=owner2; txs=([({to_=owner2;token_id=2n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + + let orig = Test.originate contract initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = TestHelpers.assert_balances orig.addr ((owner1, 1n), (owner2, 2n), (owner3, 3n)) in + () +let test_atomic_transfer_success_zero_amount_and_self_transfer = + + _test_atomic_transfer_success_zero_amount_and_self_transfer (contract_of FA2_NFT) + + +(* 5. transfer failure transitive operators *) +let _test_transfer_failure_transitive_operators (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate contract initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.not_operator +let test_transfer_failure_transitive_operators = + + _test_transfer_failure_transitive_operators (contract_of FA2_NFT) + + +(* Balance of *) + +(* 6. empty balance of + callback with empty response *) +let _test_empty_transfer_and_balance_of (contract: fa2_nft) = + let initial_storage, _owners, _operators = TestHelpers.get_initial_storage () in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + + let orig = Test.originate contract initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + Test.assert (callback_storage = ([] : nat list)) + +let test_empty_transfer_and_balance_of = _test_empty_transfer_and_balance_of (contract_of FA2_NFT) + + +(* 7. balance of failure token undefined *) +let _test_balance_of_token_undefines (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + ] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + + let orig = Test.originate contract initial_storage 0tez in + + let result = Test.transfer orig.addr (Balance_of balance_of_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.undefined_token + +let test_balance_of_token_undefines = _test_balance_of_token_undefines (contract_of FA2_NFT) + + +(* 8. duplicate balance_of requests *) +let _test_balance_of_requests_with_duplicates (contract: fa2_nft) = + let initial_storage, owners, _ = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + {owner=owner1;token_id=2n}; + ] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + + let orig = Test.originate contract initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + Test.assert (callback_storage = ([1n; 1n; 1n; 0n])) +let test_balance_of_requests_with_duplicates + + = _test_balance_of_requests_with_duplicates (contract_of FA2_NFT) + + +(* 9. 0 balance if does not hold any tokens (not in ledger) *) +let _test_balance_of_0_balance_if_address_does_not_hold_tokens (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=op1;token_id=1n}; + ] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + + let orig = Test.originate contract initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + Test.assert (callback_storage = ([1n; 1n; 0n])) +let test_balance_of_0_balance_if_address_does_not_hold_tokens = + + _test_balance_of_0_balance_if_address_does_not_hold_tokens (contract_of FA2_NFT) + + +(* Update operators *) + +(* 10. Remove operator & do transfer - failure *) +let _test_update_operator_remove_operator_and_transfer (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate contract initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner1; + operator = op1; + token_id = 1n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update) + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op1 in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.not_operator +let test_update_operator_remove_operator_and_transfer = + + _test_update_operator_remove_operator_and_transfer (contract_of FA2_NFT) + + +(* 10.1. Remove operator & do transfer - failure *) +let _test_update_operator_remove_operator_and_transfer1 (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner4 = List_helper.nth_exn 3 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate contract initial_storage 0tez in + + + let () = Test.set_source owner4 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner4; + operator = op1; + token_id = 4n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update) + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + + let storage = Test.get_storage orig.addr in + let operator_tokens = Big_map.find_opt (owner4,op1) storage.operators in + let operator_tokens = Option.unopt operator_tokens in + Test.assert (operator_tokens = Set.literal [5n]) +let test_update_operator_remove_operator_and_transfer1 = + + _test_update_operator_remove_operator_and_transfer1 (contract_of FA2_NFT) + + + +(* 11. Add operator & do transfer - success *) +let _test_update_operator_add_operator_and_transfer (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate contract initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 1n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update); + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + () +let test_update_operator_add_operator_and_transfer = + + _test_update_operator_add_operator_and_transfer (contract_of FA2_NFT) + + +(* 11.1. Add operator & do transfer - success *) +let _test_update_operator_add_operator_and_transfer1 (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner2 = List_helper.nth_exn 1 owners in + let owner4 = List_helper.nth_exn 3 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate contract initial_storage 0tez in + + + let () = Test.set_source owner4 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner4; + operator = op3; + token_id = 4n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update); + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner4; txs=([({to_=owner2;token_id=4n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + () +let test_update_operator_add_operator_and_transfer1 = + + _test_update_operator_add_operator_and_transfer1 (contract_of FA2_NFT) + + +let _test_only_sender_manage_operators (contract: fa2_nft) = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate contract initial_storage 0tez in + + + let () = Test.set_source owner2 in + let result = Test.transfer orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 1n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update); + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + + TestHelpers.assert_error result FA2_NFT.Errors.only_sender_manage_operators + + +let test_only_sender_manage_operators = _test_only_sender_manage_operators (contract_of FA2_NFT) + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/nft_jsligo.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/nft_jsligo.test.mligo new file mode 100644 index 0000000..20515ef --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/nft_jsligo.test.mligo @@ -0,0 +1,313 @@ +#import "../../../lib/fa2/nft/nft.impl.jsligo" "FA2_NFT" +#import "../balance_of_callback_contract.mligo" "Callback" +#import "../../helpers/list.mligo" "List_helper" +#import "../../helpers/nft_helpers.mligo" "TestHelpers" +(* Tests for FA2 multi asset contract *) +type return = operation list * FA2_NFT.storage +(* Transfer *) +(* 1. transfer successful *) +let _test_atomic_transfer_operator_success () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let _ = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + let () = TestHelpers.assert_balances orig.addr ((owner2, 1n), (owner2, 2n), (owner3, 3n)) in + () +let test_atomic_transfer_operator_success = _test_atomic_transfer_operator_success () +(* 1.1. transfer successful owner *) +let _test_atomic_transfer_owner_success () = + let initial_storage, owners, _ = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source owner1 in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let _ = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + let () = TestHelpers.assert_balances orig.addr ((owner2, 1n), (owner2, 2n), (owner3, 3n)) in + () +let test_atomic_transfer_owner_success = _test_atomic_transfer_owner_success () +(* 2. transfer failure token undefined *) +let _test_transfer_token_undefined () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=15n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.undefined_token +let test_transfer_token_undefined = _test_transfer_token_undefined () +(* 3. transfer failure incorrect operator *) +let _test_atomic_transfer_failure_not_operator () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op2 = List_helper.nth_exn 1 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op2 in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.not_operator +let test_atomic_transfer_failure_not_operator + = _test_atomic_transfer_failure_not_operator () +(* 4. self transfer *) +let _test_atomic_transfer_success_zero_amount_and_self_transfer () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner2; txs=([({to_=owner2;token_id=2n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let _ = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + let () = TestHelpers.assert_balances orig.addr ((owner1, 1n), (owner2, 2n), (owner3, 3n)) in + () +let test_atomic_transfer_success_zero_amount_and_self_transfer = + _test_atomic_transfer_success_zero_amount_and_self_transfer () +(* 5. transfer failure transitive operators *) +let _test_transfer_failure_transitive_operators () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.not_operator +let test_transfer_failure_transitive_operators = + _test_transfer_failure_transitive_operators () +(* Balance of *) +(* 6. empty balance of + callback with empty response *) +let _test_empty_transfer_and_balance_of () = + let initial_storage, _owners, _operators = TestHelpers.get_initial_storage () in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + let balance_of_requests = ({ + requests = ([] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let _ = Test.transfer orig.addr (Balance_of balance_of_requests) 0tez in + let callback_storage = Test.get_storage orig_callback.addr in + Test.assert (List.size(callback_storage) = 0n) +let test_empty_transfer_and_balance_of = _test_empty_transfer_and_balance_of () +(* 7. balance of failure token undefined *) +let _test_balance_of_token_undefines () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + ] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let result = Test.transfer orig.addr (Balance_of balance_of_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.undefined_token +let test_balance_of_token_undefines = _test_balance_of_token_undefines () +(* 8. duplicate balance_of requests *) +let _test_balance_of_requests_with_duplicates () = + let initial_storage, owners, _ = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=owner1;token_id=1n}; + {owner=owner1;token_id=2n}; + ] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let _ = Test.transfer orig.addr (Balance_of balance_of_requests) 0tez in + let callback_storage = Test.get_storage orig_callback.addr in + Test.assert (callback_storage = ([1n; 1n; 1n; 0n])) +let test_balance_of_requests_with_duplicates + = _test_balance_of_requests_with_duplicates () +(* 9. 0 balance if does not hold any tokens (not in ledger) *) +let _test_balance_of_0_balance_if_address_does_not_hold_tokens () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=1n}; + {owner=owner2;token_id=2n}; + {owner=op1;token_id=1n}; + ] : FA2_NFT.TZIP12.request list); + callback = callback_contract; + } : FA2_NFT.TZIP12.balance_of) in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let _ = Test.transfer orig.addr (Balance_of balance_of_requests) 0tez in + let callback_storage = Test.get_storage orig_callback.addr in + Test.assert (callback_storage = ([1n; 1n; 0n])) +let test_balance_of_0_balance_if_address_does_not_hold_tokens = + _test_balance_of_0_balance_if_address_does_not_hold_tokens () +(* Update operators *) +(* 10. Remove operator & do transfer - failure *) +let _test_update_operator_remove_operator_and_transfer () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let () = Test.set_source owner1 in + let _ = Test.transfer orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner1; + operator = op1; + token_id = 1n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update) + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + let () = Test.set_source op1 in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.not_operator +let test_update_operator_remove_operator_and_transfer = + _test_update_operator_remove_operator_and_transfer () +(* 10.1. Remove operator & do transfer - failure *) +let _test_update_operator_remove_operator_and_transfer1 () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner4 = List_helper.nth_exn 3 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let () = Test.set_source owner4 in + let _ = Test.transfer orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner4; + operator = op1; + token_id = 4n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update) + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + let storage = Test.get_storage orig.addr in + let operator_tokens = Big_map.find_opt (owner4,op1) storage.operators in + let operator_tokens = Option.unopt operator_tokens in + Test.assert (operator_tokens = Set.literal [5n]) +let test_update_operator_remove_operator_and_transfer1 = + _test_update_operator_remove_operator_and_transfer1 () +(* 11. Add operator & do transfer - success *) +let _test_update_operator_add_operator_and_transfer () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let () = Test.set_source owner1 in + let _ = Test.transfer orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 1n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update); + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner1; txs=([({to_=owner2;token_id=1n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let _ = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + () +let test_update_operator_add_operator_and_transfer = + _test_update_operator_add_operator_and_transfer () +(* 11.1. Add operator & do transfer - success *) +let _test_update_operator_add_operator_and_transfer1 () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner2 = List_helper.nth_exn 1 owners in + let owner4 = List_helper.nth_exn 3 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let () = Test.set_source owner4 in + let _ = Test.transfer orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner4; + operator = op3; + token_id = 4n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update); + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner4; txs=([({to_=owner2;token_id=4n;amount=1n} : FA2_NFT.TZIP12.atomic_trans);])}); + ] : FA2_NFT.TZIP12.transfer) + in + let _ = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + () +let test_update_operator_add_operator_and_transfer1 = + _test_update_operator_add_operator_and_transfer1 () +let _test_only_sender_manage_operators () = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + let () = Test.set_source owner2 in + let result = Test.transfer orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 1n; + } : FA2_NFT.TZIP12.operator) : FA2_NFT.TZIP12.unit_update); + ] : FA2_NFT.TZIP12.update_operators)) 0tez in + TestHelpers.assert_error result FA2_NFT.Errors.only_sender_manage_operators +let test_only_sender_manage_operators = _test_only_sender_manage_operators () diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/views.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/views.test.mligo new file mode 100644 index 0000000..f2bc6c7 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/views.test.mligo @@ -0,0 +1,112 @@ +#import "../../helpers/nft_helpers.mligo" "TestHelpers" +#import "../../helpers/list.mligo" "List_helper" +#import "../../../lib/fa2/nft/nft.impl.mligo" "FA2_NFT" +#import "./views_test_contract.mligo" "ViewsTestContract" + +(* Tests for views *) + +type orig_nft = (FA2_NFT parameter_of, FA2_NFT.storage) origination_result + +(* Test get_balance view *) +let test_get_balance_view = + let initial_storage, owners, _ = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + + let initial_storage : ViewsTestContract.storage = { + main_contract = Test.to_address orig.addr; + get_balance = (None : nat option); + total_supply = (None : nat option); + is_operator = (None : bool option); + all_tokens = (None : nat set option); + } in + + let orig_v = Test.originate (contract_of ViewsTestContract) initial_storage 0tez in + + let _ = Test.transfer_exn orig_v.addr + (Get_balance (owner1,1n) : ViewsTestContract parameter_of) 0tez + in + let storage = Test.get_storage orig_v.addr in + let get_balance = storage.get_balance in + assert (get_balance = Some 1n) + +(* Test total_supply view *) +let test_total_supply_view = + let initial_storage, _, _ = TestHelpers.get_initial_storage () in + + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + + let initial_storage : ViewsTestContract.storage = { + main_contract = Test.to_address orig.addr; + get_balance = (None : nat option); + total_supply = (None : nat option); + is_operator = (None : bool option); + all_tokens = (None : nat set option); + } in + + let orig_v = Test.originate (contract_of ViewsTestContract) initial_storage 0tez in + + let _ = Test.transfer_exn orig_v.addr + (Total_supply 2n : ViewsTestContract parameter_of) 0tez + in + let storage = Test.get_storage orig_v.addr in + let total_supply = storage.total_supply in + assert (total_supply = Some 1n) + + +(* Test total_supply view - undefined token *) +let test_total_supply_undefined_token_view = + let initial_storage, _, _ = TestHelpers.get_initial_storage () in + + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + + let initial_storage : ViewsTestContract.storage = { + main_contract = Test.to_address orig.addr; + get_balance = (None : nat option); + total_supply = (None : nat option); + is_operator = (None : bool option); + all_tokens = (None : nat set option); + } in + + let orig_v = Test.originate (contract_of ViewsTestContract) initial_storage 0tez in + + let result = Test.transfer orig_v.addr + (Total_supply 15n : ViewsTestContract parameter_of) 0tez + in + TestHelpers.assert_error result FA2_NFT.Errors.undefined_token + +(* Test is_operator view *) +let test_is_operator_view = + let initial_storage, owners, operators = TestHelpers.get_initial_storage () in + let owner1 = List_helper.nth_exn 0 owners in + let op1 = List_helper.nth_exn 0 operators in + + let orig = Test.originate (contract_of FA2_NFT) initial_storage 0tez in + + + let initial_storage : ViewsTestContract.storage = { + main_contract = Test.to_address orig.addr; + get_balance = (None : nat option); + total_supply = (None : nat option); + is_operator = (None : bool option); + all_tokens = (None : nat set option); + } in + + let orig_v = Test.originate (contract_of ViewsTestContract) initial_storage 0tez in + + let _ = Test.transfer_exn orig_v.addr + (Is_operator { + owner = owner1; + operator = op1; + token_id = 1n; + } : ViewsTestContract parameter_of) 0tez + in + let storage = Test.get_storage orig_v.addr in + let is_operator = storage.is_operator in + assert (is_operator = Some true) + + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/views_test_contract.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/views_test_contract.mligo new file mode 100644 index 0000000..7f3ac03 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/nft/views_test_contract.mligo @@ -0,0 +1,29 @@ +type storage = { + main_contract : address; + get_balance : nat option; + total_supply : nat option; + is_operator : bool option; + all_tokens : nat set option; +} + +type operator_request ={ + owner : address; + operator : address; + token_id : nat; +} + +[@entry] let get_balance (p : address * nat) (s: storage) : operation list * storage = + let get_balance : nat option = Tezos.call_view "get_balance" p s.main_contract in + [],{s with get_balance = get_balance} + +[@entry] let total_supply (p : nat) (s : storage) : operation list * storage = + let total_supply : nat option = Tezos.call_view "total_supply" p s.main_contract in + [],{s with total_supply = total_supply} + +[@entry] let is_operator (p : operator_request) (s : storage) : operation list * storage = + let is_operator : bool option = Tezos.call_view "is_operator" p s.main_contract in + [],{s with is_operator = is_operator} + +[@entry] let all_tokens () (s : storage) : operation list * storage = + let all_tokens : nat set option = Tezos.call_view "all_tokens" () s.main_contract in + [],{s with all_tokens = all_tokens} diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/single_asset.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/single_asset.test.mligo new file mode 100644 index 0000000..7a50be4 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/single_asset.test.mligo @@ -0,0 +1,356 @@ +#import "../../lib/fa2/asset/single_asset.impl.mligo" "FA2_single_asset" +#import "./balance_of_callback_contract.mligo" "Callback" + +(* Tests for FA2 single asset contract *) + +module List_helper = struct + + let nth_exn (type a) (i: int) (a: a list) : a = + let rec aux (remaining: a list) (cur: int) : a = + match remaining with + [] -> + failwith "Not found in list" + | hd :: tl -> + if cur = i then + hd + else aux tl (cur + 1) + in + aux a 0 + +end + +let get_initial_storage (a, b, c : nat * nat * nat) = + let () = Test.reset_state 6n ([] : tez list) in + + let owner1 = Test.nth_bootstrap_account 0 in + let owner2 = Test.nth_bootstrap_account 1 in + let owner3 = Test.nth_bootstrap_account 2 in + + let owners = [owner1; owner2; owner3] in + + let op1 = Test.nth_bootstrap_account 3 in + let op2 = Test.nth_bootstrap_account 4 in + let op3 = Test.nth_bootstrap_account 5 in + + let ops = [op1; op2; op3] in + + let ledger = Big_map.literal ([ + (owner1, a); + (owner2, b); + (owner3, c); + ]) + in + + let operators = Big_map.literal ([ + (owner1, Set.literal [op1]); + (owner2, Set.literal [op1;op2]); + (owner3, Set.literal [op1;op3]); + (op3 , Set.literal [op1;op2]); + ]) + in + + let token_info = (Map.empty: (string, bytes) map) in + let token_data = { + token_id = 0n; + token_info = token_info; + } in + let token_metadata = Big_map.literal ([ + (0n, token_data); + ]) + in + + + let metadata =Big_map.literal [ + ("", [%bytes {|tezos-storage:data|}]); + ("data", [%bytes +{|{ + "name":"FA2", + "description":"Example FA2 implementation", + "version":"0.1.0", + "license":{"name":"MIT"}, + "authors":["Benjamin Fuentes"], + "homepage":"", + "source":{"tools":["Ligo"], "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors":[], + "views":[] + +}|}]); +] in + + let initial_storage: FA2_single_asset.storage = { + ledger = ledger; + metadata = metadata; + token_metadata = token_metadata; + operators = operators; + } in + + initial_storage, owners, ops + +let assert_balances + (contract_address : (FA2_single_asset parameter_of, FA2_single_asset.storage) typed_address ) + (a, b, c : (address * nat) * (address * nat) * (address * nat)) = + let (owner1, balance1) = a in + let (owner2, balance2) = b in + let (owner3, balance3) = c in + let storage = Test.get_storage contract_address in + let ledger = storage.ledger in + let () = match (Big_map.find_opt owner1 ledger) with + Some amt -> assert (amt = balance1) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt owner2 ledger) with + Some amt -> assert (amt = balance2) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt owner3 ledger) with + Some amt -> assert (amt = balance3) + | None -> failwith "incorret address" + in + () + +(* Transfer *) + +(* 1. transfer successful *) +let test_atomic_transfer_success = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=2n};{to_=owner3;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;token_id=0n;amount=2n};{to_=owner1;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 8n), (owner2, 7n), (owner3, 15n)) in + () + +(* 2. transfer failure incorrect operator *) +let test_atomic_transfer_failure_not_operator = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=2n};{to_=owner3;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;token_id=0n;amount=2n};{to_=owner1;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 3. transfer failure insuffient balance *) +let test_atomic_transfer_failure_not_suffient_balance = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=20n};{to_=owner3;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;token_id=0n;amount=2n};{to_=owner1;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.ins_balance)) + | Fail _ -> failwith "invalid test failure" + +(* 4. transfer successful 0 amount & self transfer *) +let test_atomic_transfer_success_zero_amount_and_self_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=0n};{to_=owner3;token_id=0n;amount=0n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 10n), (owner2, 10n), (owner3, 10n)) in + () + +(* 5. transfer failure transitive operators *) +let test_transfer_failure_transitive_operators = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let _owner1= List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op2 = List_helper.nth_exn 1 operators in + let transfer_requests = ([ + ({from_=owner3; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op2 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* Balance of *) + +(* 6. empty balance of + callback with empty response *) +let test_empty_transfer_and_balance_of = + let initial_storage, _owners, _operators = get_initial_storage (10n, 10n, 10n) in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + + let balance_of_requests = ({ + requests = ([] : FA2_single_asset.TZIP12.request list); + callback = Test.to_contract orig_callback.addr; + } : FA2_single_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([] : nat list)) + +(* 7. duplicate balance_of requests *) +let test_balance_of_requests_with_duplicates = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let _op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=0n}; + {owner=owner1;token_id=0n}; + ] : FA2_single_asset.TZIP12.request list); + callback = Test.to_contract orig_callback.addr; + } : FA2_single_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 10n])) + +(* 8. 0 balance if does not hold any tokens (not in ledger) *) +let test_balance_of_0_balance_if_address_does_not_hold_tokens = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=0n}; + {owner=op1;token_id=0n}; + ] : FA2_single_asset.TZIP12.request list); + callback = Test.to_contract orig_callback.addr; + } : FA2_single_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 0n])) + +(* Update operators *) + +(* 9. Remove operator & do transfer - failure *) +let test_update_operator_remove_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner1; + operator = op1; + token_id = 0n; + } : FA2_single_asset.TZIP12.operator) : FA2_single_asset.TZIP12.unit_update) + ] : FA2_single_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op1 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=0n};{to_=owner3;token_id=0n;amount=0n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 10. Add operator & do transfer - success *) +let test_update_operator_add_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 0n; + } : FA2_single_asset.TZIP12.operator) : FA2_single_asset.TZIP12.unit_update); + ] : FA2_single_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source owner2 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner2; + operator = op3; + token_id = 0n; + } : FA2_single_asset.TZIP12.operator) : FA2_single_asset.TZIP12.unit_update); + ] : FA2_single_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=0n};{to_=owner3;token_id=0n;amount=0n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + () diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/single_asset_jsligo.test.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/single_asset_jsligo.test.mligo new file mode 100644 index 0000000..406f674 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/fa2/single_asset_jsligo.test.mligo @@ -0,0 +1,356 @@ +#import "../../lib/fa2/asset/single_asset.impl.jsligo" "FA2_single_asset" +#import "./balance_of_callback_contract.mligo" "Callback" + +(* Tests for FA2 single asset contract *) + +module List_helper = struct + + let nth_exn (type a) (i: int) (a: a list) : a = + let rec aux (remaining: a list) (cur: int) : a = + match remaining with + [] -> + failwith "Not found in list" + | hd :: tl -> + if cur = i then + hd + else aux tl (cur + 1) + in + aux a 0 + +end + +let get_initial_storage (a, b, c : nat * nat * nat) = + let () = Test.reset_state 6n ([] : tez list) in + + let owner1 = Test.nth_bootstrap_account 0 in + let owner2 = Test.nth_bootstrap_account 1 in + let owner3 = Test.nth_bootstrap_account 2 in + + let owners = [owner1; owner2; owner3] in + + let op1 = Test.nth_bootstrap_account 3 in + let op2 = Test.nth_bootstrap_account 4 in + let op3 = Test.nth_bootstrap_account 5 in + + let ops = [op1; op2; op3] in + + let ledger = Big_map.literal ([ + (owner1, a); + (owner2, b); + (owner3, c); + ]) + in + + let operators = Big_map.literal ([ + (owner1, Set.literal [op1]); + (owner2, Set.literal [op1;op2]); + (owner3, Set.literal [op1;op3]); + (op3 , Set.literal [op1;op2]); + ]) + in + + let token_info = (Map.empty: (string, bytes) map) in + let token_data = { + token_id = 0n; + token_info = token_info; + } in + let token_metadata = Big_map.literal ([ + (0n, token_data); + ]) + in + + let metadata =Big_map.literal [ + ("", [%bytes {|tezos-storage:data|}]); + ("data", [%bytes +{|{ + "name":"FA2", + "description":"Example FA2 implementation", + "version":"0.1.0", + "license":{"name":"MIT"}, + "authors":["Benjamin Fuentes"], + "homepage":"", + "source":{"tools":["Ligo"], "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors":[], + "views":[] + +}|}]); +] in + + let initial_storage: FA2_single_asset.storage = { + ledger = ledger; + metadata = metadata; + token_metadata = token_metadata; + operators = operators; + } in + + initial_storage, owners, ops + +let assert_balances + (contract_address : (FA2_single_asset parameter_of , FA2_single_asset.storage) typed_address ) + (a, b, c : (address * nat) * (address * nat) * (address * nat)) = + let (owner1, balance1) = a in + let (owner2, balance2) = b in + let (owner3, balance3) = c in + let storage = Test.get_storage contract_address in + let ledger = storage.ledger in + let () = match (Big_map.find_opt owner1 ledger) with + Some amt -> assert (amt = balance1) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt owner2 ledger) with + Some amt -> assert (amt = balance2) + | None -> failwith "incorret address" + in + let () = match (Big_map.find_opt owner3 ledger) with + Some amt -> assert (amt = balance3) + | None -> failwith "incorret address" + in + () + +(* Transfer *) + +(* 1. transfer successful *) +let test_atomic_transfer_success = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=2n};{to_=owner3;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;token_id=0n;amount=2n};{to_=owner1;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 8n), (owner2, 7n), (owner3, 15n)) in + () + +(* 2. transfer failure incorrect operator *) +let test_atomic_transfer_failure_not_operator = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=2n};{to_=owner3;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;token_id=0n;amount=2n};{to_=owner1;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op3 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 3. transfer failure insuffient balance *) +let test_atomic_transfer_failure_not_suffient_balance = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=20n};{to_=owner3;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner3;token_id=0n;amount=2n};{to_=owner1;token_id=0n;amount=3n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.ins_balance)) + | Fail _ -> failwith "invalid test failure" + +(* 4. transfer successful 0 amount & self transfer *) +let test_atomic_transfer_success_zero_amount_and_self_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=0n};{to_=owner3;token_id=0n;amount=0n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op1 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + let () = assert_balances orig.addr ((owner1, 10n), (owner2, 10n), (owner3, 10n)) in + () + +(* 5. transfer failure transitive operators *) +let test_transfer_failure_transitive_operators = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let _owner1= List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op2 = List_helper.nth_exn 1 operators in + let transfer_requests = ([ + ({from_=owner3; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let () = Test.set_source op2 in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* Balance of *) + +(* 6. empty balance of + callback with empty response *) +let test_empty_transfer_and_balance_of = + let initial_storage, _owners, _operators = get_initial_storage (10n, 10n, 10n) in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([] : FA2_single_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_single_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([] : nat list)) + +(* 7. duplicate balance_of requests *) +let test_balance_of_requests_with_duplicates = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let _op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=0n}; + {owner=owner1;token_id=0n}; + ] : FA2_single_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_single_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 10n])) + +(* 8. 0 balance if does not hold any tokens (not in ledger) *) +let test_balance_of_0_balance_if_address_does_not_hold_tokens = + let initial_storage, owners, operators = get_initial_storage (10n, 5n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let _owner3= List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig_callback = Test.originate (contract_of Callback) ([] : nat list) 0tez in + let callback_contract = Test.to_contract orig_callback.addr in + + let balance_of_requests = ({ + requests = ([ + {owner=owner1;token_id=0n}; + {owner=owner2;token_id=0n}; + {owner=op1;token_id=0n}; + ] : FA2_single_asset.TZIP12.request list); + callback = callback_contract; + } : FA2_single_asset.TZIP12.balance_of) in + + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + let _ = Test.transfer_exn orig.addr (Balance_of balance_of_requests) 0tez in + + let callback_storage = Test.get_storage orig_callback.addr in + assert (callback_storage = ([10n; 5n; 0n])) + +(* Update operators *) + +(* 9. Remove operator & do transfer - failure *) +let test_update_operator_remove_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op1 = List_helper.nth_exn 0 operators in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Remove_operator ({ + owner = owner1; + operator = op1; + token_id = 0n; + } : FA2_single_asset.TZIP12.operator) : FA2_single_asset.TZIP12.unit_update) + ] : FA2_single_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op1 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=0n};{to_=owner3;token_id=0n;amount=0n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let result = Test.transfer orig.addr (Transfer transfer_requests) 0tez in + match result with + Success _ -> failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval FA2_single_asset.Errors.not_operator)) + | Fail _ -> failwith "invalid test failure" + +(* 10. Add operator & do transfer - success *) +let test_update_operator_add_operator_and_transfer = + let initial_storage, owners, operators = get_initial_storage (10n, 10n, 10n) in + let owner1 = List_helper.nth_exn 0 owners in + let owner2 = List_helper.nth_exn 1 owners in + let owner3 = List_helper.nth_exn 2 owners in + let op3 = List_helper.nth_exn 2 operators in + let orig = Test.originate (contract_of FA2_single_asset) initial_storage 0tez in + + + let () = Test.set_source owner1 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner1; + operator = op3; + token_id = 0n; + } : FA2_single_asset.TZIP12.operator) : FA2_single_asset.TZIP12.unit_update); + ] : FA2_single_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source owner2 in + let _ = Test.transfer_exn orig.addr + (Update_operators ([ + (Add_operator ({ + owner = owner2; + operator = op3; + token_id = 0n; + } : FA2_single_asset.TZIP12.operator) : FA2_single_asset.TZIP12.unit_update); + ] : FA2_single_asset.TZIP12.update_operators)) 0tez in + + let () = Test.set_source op3 in + let transfer_requests = ([ + ({from_=owner1; txs=([{to_=owner2;token_id=0n;amount=0n};{to_=owner3;token_id=0n;amount=0n}] : FA2_single_asset.TZIP12.atomic_trans list)}); + ({from_=owner2; txs=([{to_=owner2;token_id=0n;amount=2n};] : FA2_single_asset.TZIP12.atomic_trans list)}); + ] : FA2_single_asset.TZIP12.transfer) + in + let _ = Test.transfer_exn orig.addr (Transfer transfer_requests) 0tez in + () + diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/helpers/list.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/helpers/list.mligo new file mode 100644 index 0000000..1166f93 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/helpers/list.mligo @@ -0,0 +1,12 @@ + +let nth_exn (type a) (i: int) (a: a list) : a = + let rec aux (remaining: a list) (cur: int) : a = + match remaining with + [] -> + failwith "Not found in list" + | hd :: tl -> + if cur = i then + hd + else aux tl (cur + 1) + in + aux a 0 diff --git a/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/helpers/nft_helpers.mligo b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/helpers/nft_helpers.mligo new file mode 100644 index 0000000..7b8f769 --- /dev/null +++ b/solution_extension/.ligo/source/i/ligo__s__fa__1.1.1__ffffffff/test/helpers/nft_helpers.mligo @@ -0,0 +1,112 @@ +#import "../../lib/fa2/nft/nft.impl.mligo" "FA2_NFT" + +let get_initial_storage () = + let () = Test.reset_state 8n ([ + 1000000tez; + 1000000tez; + 1000000tez; + 1000000tez; + 1000000tez; + 1000000tez; + 1000000tez; + 1000000tez; + ] : tez list) in + + let baker = Test.nth_bootstrap_account 7 in + let () = Test.set_baker baker in + + let owner1 = Test.nth_bootstrap_account 0 in + let owner2 = Test.nth_bootstrap_account 1 in + let owner3 = Test.nth_bootstrap_account 2 in + let owner4 = Test.nth_bootstrap_account 6 in + + let owners = [owner1; owner2; owner3; owner4] in + + let op1 = Test.nth_bootstrap_account 3 in + let op2 = Test.nth_bootstrap_account 4 in + let op3 = Test.nth_bootstrap_account 5 in + + let ops = [op1; op2; op3] in + + let ledger = Big_map.literal ([ + (1n, owner1); + (2n, owner2); + (3n, owner3); + (4n, owner4); + (5n, owner4); + ]) + in + + let operators = Big_map.literal ([ + ((owner1, op1), Set.literal [1n]); + ((owner2, op1), Set.literal [2n]); + ((owner3, op1), Set.literal [3n]); + ((op1 , op3), Set.literal [1n]); + ((owner4, op1), Set.literal [4n; 5n]); + ]) + in + + let token_metadata = (Big_map.literal [ + (1n, ({token_id=1n;token_info=(Map.empty : (string, bytes) map);} : FA2_NFT.TZIP12.tokenMetadataData)); + (2n, ({token_id=2n;token_info=(Map.empty : (string, bytes) map);} : FA2_NFT.TZIP12.tokenMetadataData)); + (3n, ({token_id=3n;token_info=(Map.empty : (string, bytes) map);} : FA2_NFT.TZIP12.tokenMetadataData)); + (4n, ({token_id=3n;token_info=(Map.empty : (string, bytes) map);} : FA2_NFT.TZIP12.tokenMetadataData)); + (5n, ({token_id=3n;token_info=(Map.empty : (string, bytes) map);} : FA2_NFT.TZIP12.tokenMetadataData)); + ] : FA2_NFT.TZIP12.tokenMetadata) in + + let metadata =Big_map.literal [ + ("", [%bytes {|tezos-storage:data|}]); + ("data", [%bytes +{|{ + "name":"FA2", + "description":"Example FA2 implementation", + "version":"0.1.0", + "license":{"name":"MIT"}, + "authors":["Benjamin Fuentes"], + "homepage":"", + "source":{"tools":["Ligo"], "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors":[], + "views":[] + +}|}]); +] in + + + let initial_storage : FA2_NFT.storage = { + ledger = ledger; + token_metadata = token_metadata; + operators = operators; + metadata = metadata; + } in + + initial_storage, owners, ops + + +let assert_balances + (contract_address : (FA2_NFT parameter_of, FA2_NFT.storage) typed_address ) + (a, b, c : (address * nat) * (address * nat) * (address * nat)) = + let (owner1, token_id_1) = a in + let (owner2, token_id_2) = b in + let (owner3, token_id_3) = c in + let storage = Test.get_storage contract_address in + let ledger = storage.ledger in + let () = match (Big_map.find_opt token_id_1 ledger) with + Some amt -> assert (amt = owner1) + | None -> Test.failwith "incorret address" + in + let () = match (Big_map.find_opt token_id_2 ledger) with + Some amt -> assert (amt = owner2) + | None -> Test.failwith "incorret address" + in + let () = match (Big_map.find_opt token_id_3 ledger) with + Some amt -> assert (amt = owner3) + | None -> Test.failwith "incorret address" + in + () + +let assert_error (result : test_exec_result) (error : FA2_NFT.Errors.t) = + match result with + Success _ -> Test.failwith "This test should fail" + | Fail (Rejected (err, _)) -> assert (Test.michelson_equal err (Test.eval error)) + | Fail _ -> Test.failwith "invalid test failure" diff --git a/solution_extension/.ligo/term_acceptance b/solution_extension/.ligo/term_acceptance new file mode 100644 index 0000000..4516383 --- /dev/null +++ b/solution_extension/.ligo/term_acceptance @@ -0,0 +1 @@ +accepted \ No newline at end of file diff --git a/solution_extension/.taq/config.json b/solution_extension/.taq/config.json new file mode 100644 index 0000000..633483d --- /dev/null +++ b/solution_extension/.taq/config.json @@ -0,0 +1,73 @@ +{ + "version": "v2", + "language": "en", + "artifactsDir": "artifacts", + "contractsDir": "contracts", + "accounts": { + "bob": { + "balance": { + "amount": "3_000_000_000", + "units": "mutez" + } + }, + "alice": { + "balance": { + "amount": "3_000_000_000", + "units": "mutez" + } + }, + "john": { + "balance": { + "amount": "3_000_000_000", + "units": "mutez" + } + }, + "jane": { + "balance": { + "amount": "3_000_000_000", + "units": "mutez" + } + }, + "joe": { + "balance": { + "amount": "3_000_000_000", + "units": "mutez" + } + } + }, + "environmentDefault": "development", + "environments": { + "development": { + "type": "flextesa", + "label": "Local Tezos Sandbox" + }, + "testing": { + "type": "simple", + "label": "ghostnet", + "rpcUrl": "https://ghostnet.tezos.marigold.dev" + }, + "production": { + "type": "simple", + "label": "mainnet", + "rpcUrl": "https://mainnet.api.tez.ie" + } + }, + "plugins": [ + { + "type": "npm", + "name": "@taqueria/plugin-ligo" + }, + { + "type": "npm", + "name": "@taqueria/plugin-taquito" + }, + { + "type": "npm", + "name": "@taqueria/plugin-octez-client" + }, + { + "type": "npm", + "name": "@taqueria/plugin-contract-types" + } + ] +} \ No newline at end of file diff --git a/solution_extension/.taq/state.json b/solution_extension/.taq/state.json new file mode 100644 index 0000000..132b420 --- /dev/null +++ b/solution_extension/.taq/state.json @@ -0,0 +1,427 @@ +// WARNING: This file is autogenerated and should NOT be modified +{ + "build": "4443226", + "configHash": "be3e18e596ca1de92147260bd11ceb666f4939638568ce8b6f76c1ba86156bc6", + "tasks": { + "ligo": { + "type": "npm", + "name": "@taqueria/plugin-ligo" + }, + "compile": { + "type": "npm", + "name": "@taqueria/plugin-ligo" + }, + "compile-all": { + "type": "npm", + "name": "@taqueria/plugin-ligo" + }, + "test": { + "type": "npm", + "name": "@taqueria/plugin-ligo" + }, + "get-image": { + "task": "get-image", + "command": "get-image", + "description": "Provided by more than one plugin. The option --plugin is required.", + "hidden": true, + "handler": "proxy", + "options": [ + { + "flag": "plugin", + "description": "Specify which plugin should be used to execute this task", + "required": true, + "choices": [ + "@taqueria/plugin-ligo", + "ligo", + "@taqueria/plugin-octez-client", + "tezos-client" + ] + } + ] + }, + "deploy": { + "type": "npm", + "name": "@taqueria/plugin-taquito" + }, + "transfer": { + "type": "npm", + "name": "@taqueria/plugin-taquito" + }, + "fund": { + "type": "npm", + "name": "@taqueria/plugin-taquito" + }, + "instantiate-account": { + "type": "npm", + "name": "@taqueria/plugin-taquito" + }, + "client": { + "type": "npm", + "name": "@taqueria/plugin-octez-client" + }, + "typecheck": { + "type": "npm", + "name": "@taqueria/plugin-octez-client" + }, + "typecheck-all": { + "type": "npm", + "name": "@taqueria/plugin-octez-client" + }, + "simulate": { + "type": "npm", + "name": "@taqueria/plugin-octez-client" + }, + "generate types": { + "type": "npm", + "name": "@taqueria/plugin-contract-types" + } + }, + "operations": {}, + "templates": { + "contract": { + "type": "npm", + "name": "@taqueria/plugin-ligo" + } + }, + "plugins": [ + { + "name": "@taqueria/plugin-ligo", + "version": "0.1", + "schema": "1.0", + "alias": "ligo", + "postInstall": "node /home/zamrokk/training-nft-1/solution_copy/node_modules/@taqueria/lib-ligo/postinstall.js", + "tasks": [ + { + "task": "ligo", + "command": "ligo", + "description": "This task allows you to run arbitrary LIGO native commands. Note that they might not benefit from the abstractions provided by Taqueria", + "encoding": "none", + "handler": "proxy", + "options": [ + { + "shortFlag": "c", + "flag": "command", + "description": "The command to be passed to the underlying LIGO binary, wrapped in quotes", + "type": "string", + "required": true + } + ] + }, + { + "task": "compile", + "command": "compile ", + "aliases": [ + "c", + "compile-ligo" + ], + "description": "Compile a smart contract written in a LIGO syntax to Michelson code, along with its associated storage/parameter list files if they are found", + "encoding": "json", + "handler": "proxy", + "options": [ + { + "flag": "json", + "description": "Emit JSON-encoded Michelson", + "boolean": true + }, + { + "shortFlag": "m", + "flag": "module", + "description": "The LIGO module to be compiled", + "type": "string" + } + ] + }, + { + "task": "compile-all", + "command": "compile-all", + "description": "Compile all main smart contracts written in a LIGO syntax to Michelson code, along with their associated storage/parameter list files if they are found", + "encoding": "json", + "handler": "proxy", + "options": [ + { + "flag": "json", + "description": "Emit JSON-encoded Michelson", + "boolean": true + } + ] + }, + { + "task": "test", + "command": "test ", + "description": "Test a smart contract written in LIGO", + "encoding": "json", + "handler": "proxy" + }, + { + "task": "get-image", + "command": "get-image", + "description": "Gets the name of the image to be used", + "hidden": true, + "handler": "proxy" + } + ], + "operations": [], + "templates": [ + { + "template": "contract", + "command": "contract ", + "description": "Create a LIGO contract with boilerplate code", + "options": [ + { + "shortFlag": "s", + "flag": "syntax", + "description": "The syntax used in the contract", + "type": "string" + } + ], + "positionals": [ + { + "placeholder": "sourceFileName", + "description": "The name of the LIGO contract to generate", + "type": "string" + } + ], + "handler": "function" + } + ] + }, + { + "name": "@taqueria/plugin-taquito", + "version": "0.1", + "schema": "1.0", + "alias": "taquito", + "tasks": [ + { + "task": "deploy", + "command": "deploy ", + "aliases": [ + "originate" + ], + "description": "Deploy a smart contract to a particular environment", + "encoding": "application/json", + "handler": "proxy", + "options": [ + { + "flag": "alias", + "description": "Alias used to refer to the deployed contract's address", + "required": false + }, + { + "flag": "storage", + "description": "Name of the storage file that contains the storage value as a Michelson expression, in the artifacts directory, used for originating a contract", + "required": false + }, + { + "flag": "sender", + "description": "Name of an instantiated account to use as the sender of the originate operation", + "required": false + }, + { + "flag": "mutez", + "description": "Amount of Mutez to transfer", + "required": false + }, + { + "shortFlag": "t", + "flag": "timeout", + "description": "Number of retry attempts (to avoid congestion and network failures)", + "defaultValue": 40, + "required": false + } + ] + }, + { + "task": "transfer", + "command": "transfer ", + "aliases": [ + "call" + ], + "description": "Transfer/call an implicit account or a smart contract (specified via its alias or address) deployed to a particular environment", + "encoding": "application/json", + "handler": "proxy", + "options": [ + { + "flag": "mutez", + "description": "Amount of Mutez to transfer", + "required": false + }, + { + "flag": "param", + "description": "Name of the parameter file that contains the parameter value as a Michelson expression, in the artifacts directory, used for invoking a deployed contract", + "required": false + }, + { + "flag": "entrypoint", + "description": "You may explicitly specify an entrypoint to make the parameter value shorter, without having to specify a chain of (Left (Right ... 14 ...))", + "required": false + }, + { + "flag": "sender", + "description": "Name of an instantiated account to use as the sender of the transfer operation", + "required": false + }, + { + "shortFlag": "t", + "flag": "timeout", + "description": "Number of retry attempts (to avoid congestion and network failures)", + "defaultValue": 40, + "required": false + } + ] + }, + { + "task": "fund", + "command": "fund", + "description": "Fund all the instantiated accounts up to the desired/declared amount in a target environment", + "encoding": "application/json", + "handler": "proxy", + "options": [ + { + "shortFlag": "t", + "flag": "timeout", + "description": "Number of retry attempts (to avoid congestion and network failures)", + "defaultValue": 40, + "required": false + } + ] + }, + { + "task": "instantiate-account", + "command": "instantiate-account", + "description": "Instantiate all accounts declared in the \"accounts\" field at the root level of the config file to a target environment", + "encoding": "application/json", + "handler": "proxy" + } + ], + "operations": [], + "templates": [] + }, + { + "name": "@taqueria/plugin-octez-client", + "version": "0.1", + "schema": "1.0", + "alias": "tezos-client", + "tasks": [ + { + "task": "client", + "command": "client", + "description": "This task allows you to run arbitrary octez-client native commands. Note that they might not benefit from the abstractions provided by Taqueria", + "encoding": "none", + "handler": "proxy", + "options": [ + { + "shortFlag": "c", + "flag": "command", + "description": "The command to be passed to the underlying octez-client binary, wrapped in quotes", + "type": "string", + "required": true + } + ] + }, + { + "task": "typecheck", + "command": "typecheck ", + "aliases": [ + "tc" + ], + "description": "Typecheck a Michelson contract", + "encoding": "json", + "handler": "proxy", + "positionals": [ + { + "placeholder": "sourceFile", + "description": "The name of the Michelson contract you wish to typecheck" + } + ] + }, + { + "task": "typecheck-all", + "command": "typecheck-all", + "description": "Typecheck all Michelson contracts in the artifacts directory", + "encoding": "json", + "handler": "proxy" + }, + { + "task": "simulate", + "command": "simulate ", + "aliases": [ + "sim" + ], + "description": "Run a Michelson contract as a simulation", + "encoding": "json", + "handler": "proxy", + "options": [ + { + "flag": "storage", + "description": "Name of the storage file that contains the storage value as a Michelson expression, in the artifacts directory, used for originating a contract", + "required": false + }, + { + "flag": "param", + "description": "Name of the parameter file that contains the parameter value as a Michelson expression, in the artifacts directory, used for invoking a deployed contract", + "required": true + }, + { + "flag": "entrypoint", + "description": "You may explicitly specify an entrypoint to make the parameter value shorter, without having to specify a chain of (Left (Right ... 14 ...))", + "required": false + } + ], + "positionals": [ + { + "placeholder": "sourceFile", + "description": "The name of the Michelson contract you wish to simulate" + } + ] + }, + { + "task": "get-image", + "command": "get-image", + "description": "Gets the name of the image to be used", + "hidden": true, + "handler": "proxy" + } + ], + "operations": [], + "templates": [] + }, + { + "name": "@taqueria/plugin-contract-types", + "version": "0.1", + "schema": "1.0", + "alias": "contract-types", + "tasks": [ + { + "task": "generate types", + "command": "generate types [typescriptDir]", + "aliases": [ + "gen types", + "gentypes" + ], + "description": "Generate types for a contract to be used with taquito", + "handler": "proxy", + "options": [ + { + "shortFlag": "t", + "flag": "typeAliasMode", + "description": "The type aliases used in the generated types", + "choices": [ + "file", + "simple" + ] + } + ], + "positionals": [ + { + "placeholder": "typescriptDir", + "description": "The output directory for the generated type files", + "defaultValue": "types" + } + ] + } + ], + "operations": [], + "templates": [] + } + ] +} \ No newline at end of file diff --git a/solution_extension/_ligo/ligo/installation.json b/solution_extension/_ligo/ligo/installation.json new file mode 100644 index 0000000..857b94a --- /dev/null +++ b/solution_extension/_ligo/ligo/installation.json @@ -0,0 +1 @@ +{"app@link-dev:./ligo.json":"/project","@ligo/fa@1.1.1@ffffffff":"./.ligo/source/i/ligo__s__fa__1.1.1__ffffffff"} \ No newline at end of file diff --git a/solution_extension/app/.env b/solution_extension/app/.env new file mode 100755 index 0000000..b38bea3 --- /dev/null +++ b/solution_extension/app/.env @@ -0,0 +1,5 @@ +VITE_CONTRACT_ADDRESS=KT1F56e28pcdTFJot999SWdXr7vuDPu7yYSo +VITE_PINATA_API_KEY=701d3e9951e2ad5e7d63 +VITE_PINATA_API_SECRET=adc566d96514e6ddd076ad531c36b536e7b6f33b36625c136f2100d2909da880 +VITE_TEZOS_NODE=https://ghostnet.tezos.marigold.dev +#VITE_TEZOS_NODE=https://ghostnet.ecadinfra.com \ No newline at end of file diff --git a/solution_extension/app/.eslintrc.cjs b/solution_extension/app/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/solution_extension/app/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/solution_extension/app/.gitignore b/solution_extension/app/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/solution_extension/app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/solution_extension/app/README.md b/solution_extension/app/README.md new file mode 100644 index 0000000..1ebe379 --- /dev/null +++ b/solution_extension/app/README.md @@ -0,0 +1,27 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/solution_extension/app/index.html b/solution_extension/app/index.html new file mode 100644 index 0000000..61c56ff --- /dev/null +++ b/solution_extension/app/index.html @@ -0,0 +1,14 @@ + + + + + + + Vite + React + TS + + +
+ + + + diff --git a/solution_extension/app/package.json b/solution_extension/app/package.json new file mode 100644 index 0000000..1985ee8 --- /dev/null +++ b/solution_extension/app/package.json @@ -0,0 +1,54 @@ +{ + "name": "reactboilerplateapp", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "if test -f .env; then sed -i \"s/\\(VITE_CONTRACT_ADDRESS *= *\\).*/\\1$(jq -r 'last(.tasks[]).output[0].address' ../.taq/testing-state.json)/\" .env ; else jq -r '\"VITE_CONTRACT_ADDRESS=\" + last(.tasks[]).output[0].address' ../.taq/testing-state.json > .env ; fi && vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@airgap/beacon-sdk": "^4.0.6", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.14.3", + "@mui/material": "^5.14.3", + "@taquito/beacon-wallet": "^17.1.1", + "@taquito/taquito": "^17.1.1", + "@taquito/tzip12": "^17.1.1", + "@tzkt/sdk-api": "^2.2.1", + "formik": "^2.4.3", + "notistack": "^3.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-swipeable-views": "^0.14.0", + "yup": "^1.2.0" + }, + "devDependencies": { + "@airgap/beacon-types": "^4.0.6", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@types/react-swipeable-views": "^0.13.2", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "assert": "^2.0.0", + "buffer": "^6.0.3", + "crypto-browserify": "^3.12.0", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "react-router-dom": "^6.14.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "typescript": "^5.0.2", + "url": "^0.11.1", + "vite": "^4.4.5" + } +} diff --git a/solution_extension/app/public/favicon.ico b/solution_extension/app/public/favicon.ico new file mode 100644 index 0000000..134247b Binary files /dev/null and b/solution_extension/app/public/favicon.ico differ diff --git a/solution_extension/app/public/logo.png b/solution_extension/app/public/logo.png new file mode 100644 index 0000000..134247b Binary files /dev/null and b/solution_extension/app/public/logo.png differ diff --git a/solution_extension/app/public/vite.svg b/solution_extension/app/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/solution_extension/app/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/solution_extension/app/public/winelord.gif b/solution_extension/app/public/winelord.gif new file mode 100755 index 0000000..def8a6c Binary files /dev/null and b/solution_extension/app/public/winelord.gif differ diff --git a/solution_extension/app/public/winelord.png b/solution_extension/app/public/winelord.png new file mode 100755 index 0000000..da45a62 Binary files /dev/null and b/solution_extension/app/public/winelord.png differ diff --git a/solution_extension/app/src/App.css b/solution_extension/app/src/App.css new file mode 100644 index 0000000..03c2147 --- /dev/null +++ b/solution_extension/app/src/App.css @@ -0,0 +1,43 @@ +.App { + text-align: center; + background-color: #282c34; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-logo { + height: 10vh; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + } +} + +.App-header { + max-height: 10vh; + width: 100%; + background-color: white; +} + +.App-body { + height: 90vh; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/solution_extension/app/src/App.tsx b/solution_extension/app/src/App.tsx new file mode 100644 index 0000000..a472281 --- /dev/null +++ b/solution_extension/app/src/App.tsx @@ -0,0 +1,142 @@ +import { NetworkType } from "@airgap/beacon-types"; +import { BeaconWallet } from "@taquito/beacon-wallet"; +import { TezosToolkit } from "@taquito/taquito"; +import { TokenMetadata, tzip12, Tzip12Module } from "@taquito/tzip12"; +import * as api from "@tzkt/sdk-api"; +import { BigNumber } from "bignumber.js"; +import React, { Dispatch, SetStateAction, useEffect, useState } from "react"; +import "./App.css"; +import { NftWalletType, Storage } from "./nft.types"; +import Paperbase from "./Paperbase"; +export type TZIP21TokenMetadata = TokenMetadata & { + artifactUri?: string; //A URI (as defined in the JSON Schema Specification) to the asset. + displayUri?: string; //A URI (as defined in the JSON Schema Specification) to an image of the asset. + thumbnailUri?: string; //A URI (as defined in the JSON Schema Specification) to an image of the asset for wallets and client applications to have a scaled down image to present to end-users. + description?: string; //General notes, abstracts, or summaries about the contents of an asset. + minter?: string; //The tz address responsible for minting the asset. + creators?: string[]; //The primary person, people, or organization(s) responsible for creating the intellectual content of the asset. + isBooleanAmount?: boolean; //Describes whether an account can have an amount of exactly 0 or 1. (The purpose of this field is for wallets to determine whether or not to display balance information and an amount field when transferring.) +}; + +export type UserContextType = { + storage: Storage | null; + userAddress: string; + userBalance: number; + setUserAddress: Dispatch>; + Tezos: TezosToolkit; + setUserBalance: Dispatch>; + wallet: BeaconWallet; + nftContractAddress: string; + nftContrat: NftWalletType | null; + setNftContrat: Dispatch>; + nftContratTokenMetadataMap: Map; + setNftContratTokenMetadataMap: Dispatch< + SetStateAction> + >; + refreshUserContextOnPageReload: () => Promise; +}; + +export let UserContext = React.createContext(null); +const nftContractAddress = import.meta.env.VITE_CONTRACT_ADDRESS; + +function App() { + api.defaults.baseUrl = "https://api.ghostnet.tzkt.io"; + + const [storage, setStorage] = useState(null); + const [userAddress, setUserAddress] = useState(""); + const [userBalance, setUserBalance] = useState(0); + const [nftContrat, setNftContrat] = useState(null); + const [nftContratTokenMetadataMap, setNftContratTokenMetadataMap] = useState< + Map + >(new Map()); + + const [Tezos, _] = useState( + new TezosToolkit(import.meta.env.VITE_TEZOS_NODE) + ); + const [wallet, __] = useState( + new BeaconWallet({ + name: "Training", + preferredNetwork: NetworkType.GHOSTNET, + }) + ); + + const refreshUserContextOnPageReload = async () => { + console.log("refreshUserContext"); + //CONTRACT + try { + let c = await Tezos.contract.at(nftContractAddress, tzip12); + console.log("nftContractAddress", nftContractAddress); + + let nftContrat: NftWalletType = await Tezos.wallet.at( + nftContractAddress + ); + const storage = (await nftContrat.storage()) as Storage; + + const token_metadataBigMapId = ( + storage.token_metadata as unknown as { id: BigNumber } + ).id.toNumber(); + + const token_ids = await api.bigMapsGetKeys(token_metadataBigMapId, { + micheline: "Json", + active: true, + }); + + await Promise.all( + token_ids.map(async (token_id: api.BigMapKey) => { + let tokenMetadata: TZIP21TokenMetadata = (await c + .tzip12() + .getTokenMetadata(token_id.key)) as TZIP21TokenMetadata; + nftContratTokenMetadataMap.set(token_id.key, tokenMetadata); + }) + ); + setNftContratTokenMetadataMap(new Map(nftContratTokenMetadataMap)); //new Map to force refresh + setNftContrat(nftContrat); + setStorage(storage); + } catch (error) { + console.log("error refreshing nft contract: ", error); + } + + //USER + const activeAccount = await wallet.client.getActiveAccount(); + if (activeAccount) { + setUserAddress(activeAccount.address); + const balance = await Tezos.tz.getBalance(activeAccount.address); + setUserBalance(balance.toNumber()); + } + + console.log("refreshUserContext ended."); + }; + + useEffect(() => { + Tezos.setWalletProvider(wallet); + Tezos.addExtension(new Tzip12Module()); + }, [wallet]); + + useEffect(() => { + refreshUserContextOnPageReload(); + }, []); + + return ( + + + + ); +} + +export default App; diff --git a/solution_extension/app/src/ConnectWallet.tsx b/solution_extension/app/src/ConnectWallet.tsx new file mode 100644 index 0000000..7ac935e --- /dev/null +++ b/solution_extension/app/src/ConnectWallet.tsx @@ -0,0 +1,57 @@ +import { NetworkType } from "@airgap/beacon-sdk"; +import { Wallet } from "@mui/icons-material"; +import { Button } from "@mui/material"; +import { BeaconWallet } from "@taquito/beacon-wallet"; +import { TezosToolkit } from "@taquito/taquito"; +import { Dispatch, SetStateAction } from "react"; +import { useNavigate } from "react-router-dom"; +import { TZIP21TokenMetadata } from "./App"; +import { PagesPaths } from "./Navigator"; + +type ButtonProps = { + Tezos: TezosToolkit; + setUserAddress: Dispatch>; + setUserBalance: Dispatch>; + wallet: BeaconWallet; + nftContratTokenMetadataMap: Map; +}; + +const ConnectButton = ({ + Tezos, + setUserAddress, + setUserBalance, + wallet, + nftContratTokenMetadataMap, +}: ButtonProps): JSX.Element => { + const navigate = useNavigate(); + + const connectWallet = async (): Promise => { + try { + await wallet.requestPermissions({ + network: { + type: NetworkType.GHOSTNET, + rpcUrl: import.meta.env.VITE_TEZOS_NODE, + }, + }); + // gets user's address + const userAddress = await wallet.getPKH(); + const balance = await Tezos.tz.getBalance(userAddress); + setUserBalance(balance.toNumber()); + setUserAddress(userAddress); + if (nftContratTokenMetadataMap && nftContratTokenMetadataMap.size > 0) + navigate(PagesPaths.CATALOG); + else navigate(PagesPaths.MINT); + } catch (error) { + console.log(error); + } + }; + + return ( + + ); +}; + +export default ConnectButton; diff --git a/solution_extension/app/src/DisconnectWallet.tsx b/solution_extension/app/src/DisconnectWallet.tsx new file mode 100644 index 0000000..613eb8d --- /dev/null +++ b/solution_extension/app/src/DisconnectWallet.tsx @@ -0,0 +1,44 @@ +import { Logout } from "@mui/icons-material"; +import { Button, ButtonGroup, Tooltip } from "@mui/material"; +import { BeaconWallet } from "@taquito/beacon-wallet"; +import { Dispatch, SetStateAction } from "react"; +import { useNavigate } from "react-router-dom"; +import { PagesPaths } from "./Navigator"; +interface ButtonProps { + userAddress: string; + userBalance: number; + wallet: BeaconWallet; + setUserAddress: Dispatch>; + setUserBalance: Dispatch>; +} + +const DisconnectButton = ({ + userAddress, + userBalance, + wallet, + setUserAddress, + setUserBalance, +}: ButtonProps): JSX.Element => { + const navigate = useNavigate(); + + const disconnectWallet = async (): Promise => { + setUserAddress(""); + setUserBalance(0); + console.log("disconnecting wallet"); + await wallet.clearActiveAccount(); + navigate(PagesPaths.CATALOG); + }; + + return ( + + + + + + + ); +}; + +export default DisconnectButton; diff --git a/solution_extension/app/src/Header.tsx b/solution_extension/app/src/Header.tsx new file mode 100644 index 0000000..fdcd7aa --- /dev/null +++ b/solution_extension/app/src/Header.tsx @@ -0,0 +1,77 @@ +import MenuIcon from "@mui/icons-material/Menu"; +import { Typography } from "@mui/material"; +import AppBar from "@mui/material/AppBar"; +import Grid from "@mui/material/Grid"; +import IconButton from "@mui/material/IconButton"; +import Toolbar from "@mui/material/Toolbar"; +import * as React from "react"; +import { UserContext, UserContextType } from "./App"; +import ConnectButton from "./ConnectWallet"; +import DisconnectButton from "./DisconnectWallet"; + +interface HeaderProps { + onDrawerToggle: () => void; +} + +export default function Header(props: HeaderProps) { + const { onDrawerToggle } = props; + + const { + userAddress, + userBalance, + Tezos, + setUserAddress, + setUserBalance, + wallet, + nftContratTokenMetadataMap, + } = React.useContext(UserContext) as UserContextType; + + return ( + theme.zIndex.drawer + 1 }} + > + + + + + + + NFT Wine Factory + + + + + + + + + {!userAddress ? ( + + ) : ( + + )} + + + + + ); +} diff --git a/solution_extension/app/src/MintPage.tsx b/solution_extension/app/src/MintPage.tsx new file mode 100644 index 0000000..fffc826 --- /dev/null +++ b/solution_extension/app/src/MintPage.tsx @@ -0,0 +1,416 @@ +import { + AddCircleOutlined, + Close, + KeyboardArrowLeft, + KeyboardArrowRight, +} from "@mui/icons-material"; +import OpenWithIcon from "@mui/icons-material/OpenWith"; +import { + Box, + Button, + CardHeader, + CardMedia, + MobileStepper, + Stack, + SwipeableDrawer, + TextField, + Toolbar, + useMediaQuery, +} from "@mui/material"; +import Card from "@mui/material/Card"; +import CardContent from "@mui/material/CardContent"; +import Paper from "@mui/material/Paper"; +import Typography from "@mui/material/Typography"; +import { char2Bytes } from "@taquito/utils"; +import { BigNumber } from "bignumber.js"; +import { useFormik } from "formik"; +import { useSnackbar } from "notistack"; +import React, { useEffect, useState } from "react"; +import SwipeableViews from "react-swipeable-views"; +import * as yup from "yup"; +import { TZIP21TokenMetadata, UserContext, UserContextType } from "./App"; +import { TransactionInvalidBeaconError } from "./TransactionInvalidBeaconError"; +import { address, bytes, nat } from "./type-aliases"; + +export default function MintPage() { + const { + userAddress, + nftContratTokenMetadataMap, + storage, + refreshUserContextOnPageReload, + nftContrat, + } = React.useContext(UserContext) as UserContextType; + + const isTablet = useMediaQuery("(min-width:600px)"); + + const validationSchema = yup.object({ + name: yup.string().required("Name is required"), + description: yup.string().required("Description is required"), + symbol: yup.string().required("Symbol is required"), + }); + + const formik = useFormik({ + initialValues: { + name: "", + description: "", + token_id: 0, + symbol: "WINE", + } as TZIP21TokenMetadata, + validationSchema: validationSchema, + onSubmit: (values) => { + mint(values); + }, + }); + + const [pictureUrl, setPictureUrl] = useState(""); + const [file, setFile] = useState(null); + + //open mint drawer if admin + const [formOpen, setFormOpen] = useState(false); + + useEffect(() => { + if (storage && storage.administrators.indexOf(userAddress! as address) < 0) + setFormOpen(false); + else setFormOpen(true); + }, [userAddress]); + + const toggleDrawer = + (open: boolean) => (event: React.KeyboardEvent | React.MouseEvent) => { + if ( + event.type === "keydown" && + ((event as React.KeyboardEvent).key === "Tab" || + (event as React.KeyboardEvent).key === "Shift") + ) { + return; + } + setFormOpen(open); + }; + + const { enqueueSnackbar } = useSnackbar(); + + const mint = async (newTokenDefinition: TZIP21TokenMetadata) => { + try { + //IPFS + if (file) { + const formData = new FormData(); + formData.append("file", file); + + const requestHeaders: HeadersInit = new Headers(); + requestHeaders.set( + "pinata_api_key", + `${import.meta.env.VITE_PINATA_API_KEY}` + ); + requestHeaders.set( + "pinata_secret_api_key", + `${import.meta.env.VITE_PINATA_API_SECRET}` + ); + + const resFile = await fetch( + "https://api.pinata.cloud/pinning/pinFileToIPFS", + { + method: "post", + body: formData, + headers: requestHeaders, + } + ); + + const responseJson = await resFile.json(); + console.log("responseJson", responseJson); + + const thumbnailUri = `ipfs://${responseJson.IpfsHash}`; + setPictureUrl( + `https://gateway.pinata.cloud/ipfs/${responseJson.IpfsHash}` + ); + + const op = await nftContrat!.methods + .mint( + new BigNumber(newTokenDefinition.token_id) as nat, + char2Bytes(newTokenDefinition.name!) as bytes, + char2Bytes(newTokenDefinition.description!) as bytes, + char2Bytes(newTokenDefinition.symbol!) as bytes, + char2Bytes(thumbnailUri) as bytes + ) + .send(); + + //close directly the form + setFormOpen(false); + enqueueSnackbar( + "Wine collection is minting ... it will be ready on next block, wait for the confirmation message before minting another collection", + { variant: "info" } + ); + + await op.confirmation(2); + + enqueueSnackbar("Wine collection minted", { variant: "success" }); + + refreshUserContextOnPageReload(); //force all app to refresh the context + } + } catch (error) { + console.table(`Error: ${JSON.stringify(error, null, 2)}`); + let tibe: TransactionInvalidBeaconError = + new TransactionInvalidBeaconError(error); + enqueueSnackbar(tibe.data_message, { + variant: "error", + autoHideDuration: 10000, + }); + } + }; + + useEffect(() => { + (async () => { + if (nftContratTokenMetadataMap && nftContratTokenMetadataMap.size > 0) { + formik.setFieldValue("token_id", nftContratTokenMetadataMap.size); + } + })(); + }, [nftContratTokenMetadataMap?.size]); + + const [activeStep, setActiveStep] = React.useState(0); + + const handleNext = () => { + setActiveStep((prevActiveStep) => prevActiveStep + 1); + }; + + const handleBack = () => { + setActiveStep((prevActiveStep) => prevActiveStep - 1); + }; + + const handleStepChange = (step: number) => { + setActiveStep(step); + }; + + return ( + + {storage ? ( + + ) : ( + "" + )} + + + + + +
+ + Mint a new collection + + + + + + + {pictureUrl ? ( + + ) : ( + "" + )} + + + + +
+
+
+ + Mint your wine collection + + {nftContratTokenMetadataMap.size != 0 ? ( + + + {Array.from(nftContratTokenMetadataMap!.entries()).map( + ([token_id, token]) => ( + + + + + + + + {"ID : " + token_id} + {"Symbol : " + token.symbol} + + {"Description : " + token.description} + + + + + ) + )} + + + Next + + + } + backButton={ + + } + /> + + ) : ( + + Sorry, there is not NFT yet, you need to mint bottles first + + )} +
+ ); +} diff --git a/solution_extension/app/src/Navigator.tsx b/solution_extension/app/src/Navigator.tsx new file mode 100644 index 0000000..87b907c --- /dev/null +++ b/solution_extension/app/src/Navigator.tsx @@ -0,0 +1,150 @@ +import SellIcon from "@mui/icons-material/Sell"; +import SettingsIcon from "@mui/icons-material/Settings"; +import WineBarIcon from "@mui/icons-material/WineBar"; +import { Stack } from "@mui/material"; +import Box from "@mui/material/Box"; +import Divider from "@mui/material/Divider"; +import Drawer, { DrawerProps } from "@mui/material/Drawer"; +import MaterialLink from "@mui/material/Link"; +import List from "@mui/material/List"; +import ListItem from "@mui/material/ListItem"; +import ListItemButton from "@mui/material/ListItemButton"; +import ListItemIcon from "@mui/material/ListItemIcon"; +import ListItemText from "@mui/material/ListItemText"; +import Toolbar from "@mui/material/Toolbar"; +import Typography from "@mui/material/Typography"; +import React, { useEffect, useState } from "react"; +import { Link, useLocation } from "react-router-dom"; +import { UserContext, UserContextType } from "./App"; + +export enum PagesPaths { + CATALOG = "", + OFFERS = "offers", + MINT = "mint", +} + +const item = { + py: "2px", + px: 3, + color: "rgba(255, 255, 255, 0.7)", + "&:hover, &:focus": { + bgcolor: "rgba(255, 255, 255, 0.08)", + }, +}; + +export default function Navigator(props: DrawerProps) { + const { ...other } = props; + const location = useLocation(); + const { userAddress, nftContratTokenMetadataMap } = React.useContext( + UserContext + ) as UserContextType; + + const [categories, setCategories] = useState< + { + id: string; + children: { id: string; icon: JSX.Element; path: string }[]; + }[] + >([ + { + id: "Administration", + children: [ + { + id: "Mint wine collection", + icon: , + path: "/" + PagesPaths.MINT, + }, + ], + }, + ]); + + useEffect(() => { + if (nftContratTokenMetadataMap && nftContratTokenMetadataMap.size > 0) + setCategories([ + { + id: "Trading", + children: [ + { + id: "Wine catalogue", + icon: , + path: "/" + PagesPaths.CATALOG, + }, + { + id: "Sell bottles", + icon: , + path: "/" + PagesPaths.OFFERS, + }, + ], + }, + { + id: "Administration", + children: [ + { + id: "Wine collection", + icon: , + path: "/" + PagesPaths.MINT, + }, + ], + }, + ]); + }, [nftContratTokenMetadataMap, userAddress]); + + function Copyright() { + return ( + + {"Copyright © "} + + Marigold + {" "} + {new Date().getFullYear()} + + ); + } + + return ( + + + + + + {userAddress + ? categories.map(({ id, children }) => ( + + + + {id} + + + {children.map(({ id: childId, icon, path }) => ( + + + + + {icon} + {childId} + + + + + ))} + + + )) + : ""} + + + + + ); +} diff --git a/solution_extension/app/src/OffersPage.tsx b/solution_extension/app/src/OffersPage.tsx new file mode 100644 index 0000000..90f94bb --- /dev/null +++ b/solution_extension/app/src/OffersPage.tsx @@ -0,0 +1,27 @@ +import { Typography, useMediaQuery } from "@mui/material"; +import Paper from "@mui/material/Paper"; +import React, { Fragment } from "react"; +import { UserContext, UserContextType } from "./App"; + +export default function OffersPage() { + const { nftContratTokenMetadataMap } = React.useContext( + UserContext + ) as UserContextType; + const isDesktop = useMediaQuery("(min-width:1100px)"); + const isTablet = useMediaQuery("(min-width:600px)"); + + return ( + + + Sell my bottles + + {nftContratTokenMetadataMap.size > 0 ? ( + //TODO + ) : ( + + Sorry, there is not NFT yet, you need to mint bottles first + + )} + + ); +} diff --git a/solution_extension/app/src/Paperbase.tsx b/solution_extension/app/src/Paperbase.tsx new file mode 100644 index 0000000..c987014 --- /dev/null +++ b/solution_extension/app/src/Paperbase.tsx @@ -0,0 +1,282 @@ +import { createTheme, ThemeProvider } from "@mui/material"; +import Box from "@mui/material/Box"; +import CssBaseline from "@mui/material/CssBaseline"; +import Toolbar from "@mui/material/Toolbar"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import * as React from "react"; +import { BrowserRouter, Outlet, Route, Routes } from "react-router-dom"; +import Header from "./Header"; +import MintPage from "./MintPage"; +import Navigator, { PagesPaths } from "./Navigator"; +import OffersPage from "./OffersPage"; +import WineCataloguePage from "./WineCataloguePage"; + +let theme = createTheme({ + palette: { + primary: { + main: "#ffffff", + }, + secondary: { + main: "#D8464E", + }, + background: { + default: "#1C1D22", + paper: "#1C1D22", + }, + text: { + primary: "#ffffff", + secondary: "#A0A0A0", + }, + }, + typography: { + fontFamily: [ + "Roboto Mono", + "monospace", + "Helvetica Neue", + "Arial", + "sans-serif", + ].join(","), + }, +}); + +theme = { + ...theme, + components: { + MuiDrawer: { + styleOverrides: { + paper: { + backgroundColor: "#2B2A2E", + borderRight: "none", + }, + }, + }, + MuiTypography: { + styleOverrides: { + body1: { + color: theme.palette.primary.main, + }, + body2: { + color: theme.palette.text.secondary, + }, + }, + }, + MuiIconButton: { + styleOverrides: { + root: { + textTransform: "none", + backgroundColor: theme.palette.secondary.main, + color: theme.palette.primary.main, + }, + }, + }, + MuiButtonBase: { + styleOverrides: { + root: { + borderRadius: "0", + padding: 0, + }, + }, + }, + MuiInputBase: { + styleOverrides: { + input: { + padding: 0, + color: theme.palette.text.secondary, + "&.Mui-disabled": { + color: theme.palette.secondary.main, + WebkitTextFillColor: theme.palette.secondary.main, + }, + }, + }, + }, + MuiFilledInput: { + styleOverrides: { + input: { + color: theme.palette.text.secondary, + "&.Mui-disabled": { + color: theme.palette.secondary.main, + WebkitTextFillColor: theme.palette.secondary.main, + }, + }, + }, + }, + MuiInputLabel: { + styleOverrides: { + root: { + "&.Mui-disabled": { + color: theme.palette.secondary.main, + WebkitTextFillColor: theme.palette.secondary.main, + }, + }, + }, + }, + MuiButton: { + styleOverrides: { + root: { + textTransform: "none", + backgroundColor: theme.palette.secondary.main, + color: theme.palette.primary.main, + padding: 0, + boxShadow: "none", + borderRadius: "0", + "&:active": { + boxShadow: "none", + }, + "&:hover": { + backgroundColor: theme.palette.primary.main, + color: theme.palette.secondary.main, + boxShadow: "none", + }, + }, + }, + }, + + MuiFormLabel: { + styleOverrides: { + root: { + color: theme.palette.text.primary, + }, + }, + }, + MuiAppBar: { + styleOverrides: { + root: { + backgroundColor: theme.palette.background.default, + color: theme.palette.primary.main, + }, + }, + }, + MuiPaper: { + styleOverrides: { + root: { + borderRight: "none", + }, + }, + }, + MuiPaginationItem: { + styleOverrides: { + root: { + "&.Mui-selected": { backgroundColor: theme.palette.secondary.main }, + }, + }, + }, + MuiCard: { + styleOverrides: { + root: { + borderColor: theme.palette.text.secondary, + borderWidth: 1, + borderStyle: "solid", + borderRadius: "0", + }, + }, + }, + MuiListItemIcon: { + styleOverrides: { + root: { + color: theme.palette.primary.main, + }, + }, + }, + MuiCardHeader: { + styleOverrides: { + root: { + height: "4em", + }, + }, + }, + + MuiSvgIcon: { + styleOverrides: { + root: { + height: "auto", + }, + }, + }, + MuiTextField: { + styleOverrides: { + root: { + borderColor: theme.palette.text.secondary, + color: theme.palette.text.secondary, + borderWidth: 2, + borderStyle: "solid", + borderRadius: "0", + }, + }, + }, + }, +}; + +const drawerWidth = 256; + +export default function Paperbase() { + const [mobileOpen, setMobileOpen] = React.useState(false); + const isSmUp = useMediaQuery(theme.breakpoints.up("sm")); + + const handleDrawerToggle = () => { + setMobileOpen(!mobileOpen); + }; + + return ( + + + + + +
+ + {isSmUp ? null : ( + + )} + + + + + + + + + + + } + > + } /> + } /> + } /> + + + + + ); +} diff --git a/solution_extension/app/src/TransactionInvalidBeaconError.ts b/solution_extension/app/src/TransactionInvalidBeaconError.ts new file mode 100644 index 0000000..2c65ffe --- /dev/null +++ b/solution_extension/app/src/TransactionInvalidBeaconError.ts @@ -0,0 +1,78 @@ +const errorMap: Map = new Map([ + ["0", "Enter a positive and not null amount"], + ["1", "Operation not allowed, you need to be administrator"], + ["2", "You cannot sell more than your current balance"], + ["3", "Cannot find the offer you entered for buying"], + ["4", "You entered a quantity to buy than is more than the offer quantity"], + [ + "5", + "Not enough funds, you need to pay at least quantity * bif price to get the tokens", + ], + ["6", "Cannot find the contract relative to implicit address"], +]); + +export class TransactionInvalidBeaconError { + name: string; + title: string; + message: string; + description: string; + data_contract_handle: string; + data_with_string: string; + data_expected_form: string; + data_message: string; + + /** + * + * @param transactionInvalidBeaconError { + "name": "UnknownBeaconError", + "title": "Aborted", + "message": "[ABORTED_ERROR]:The action was aborted by the user.", + "description": "The action was aborted by the user." +} +*/ + + constructor(transactionInvalidBeaconError: any) { + this.name = transactionInvalidBeaconError.name; + this.title = transactionInvalidBeaconError.title; + this.message = transactionInvalidBeaconError.message; + this.description = transactionInvalidBeaconError.description; + this.data_contract_handle = ""; + this.data_with_string = ""; + this.data_expected_form = ""; + this.data_message = this.message; + if (transactionInvalidBeaconError.data !== undefined) { + let dataArray = Array.from( + new Map( + Object.entries(transactionInvalidBeaconError.data) + ).values() + ); + let contract_handle = dataArray.find( + (obj) => obj.contract_handle !== undefined + ); + this.data_contract_handle = + contract_handle !== undefined ? contract_handle.contract_handle : ""; + let withString = dataArray.find((obj) => obj.with !== undefined); + this.data_with_string = + withString !== undefined ? withString.with.string : ""; + let expected_form = dataArray.find( + (obj) => obj.expected_form !== undefined + ); + this.data_expected_form = + expected_form !== undefined + ? expected_form.expected_form + + ":" + + expected_form.wrong_expression.string + : ""; + this.data_message = + (this.data_contract_handle + ? "Error on contract : " + this.data_contract_handle + " " + : "") + + (this.data_with_string + ? "error : " + errorMap.get(this.data_with_string) + " " + : "") + + (this.data_expected_form + ? "error : " + this.data_expected_form + " " + : ""); + } + } +} diff --git a/solution_extension/app/src/WineCataloguePage.tsx b/solution_extension/app/src/WineCataloguePage.tsx new file mode 100644 index 0000000..5d46327 --- /dev/null +++ b/solution_extension/app/src/WineCataloguePage.tsx @@ -0,0 +1,30 @@ +import { useMediaQuery } from "@mui/material"; +import Paper from "@mui/material/Paper"; +import Typography from "@mui/material/Typography"; + +import React from "react"; +import { UserContext, UserContextType } from "./App"; + +export default function WineCataloguePage() { + const { nftContratTokenMetadataMap } = React.useContext( + UserContext + ) as UserContextType; + const isDesktop = useMediaQuery("(min-width:1100px)"); + const isTablet = useMediaQuery("(min-width:600px)"); + + return ( + + + Wine catalogue + + + {nftContratTokenMetadataMap.size > 0 ? ( + "//TODO" + ) : ( + + Sorry, there is not NFT yet, you need to mint bottles first + + )} + + ); +} diff --git a/solution_extension/app/src/assets/react.svg b/solution_extension/app/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/solution_extension/app/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/solution_extension/app/src/index.css b/solution_extension/app/src/index.css new file mode 100644 index 0000000..2c3fac6 --- /dev/null +++ b/solution_extension/app/src/index.css @@ -0,0 +1,69 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/solution_extension/app/src/main.tsx b/solution_extension/app/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/solution_extension/app/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/solution_extension/app/src/nft.code.ts b/solution_extension/app/src/nft.code.ts new file mode 100644 index 0000000..1add404 --- /dev/null +++ b/solution_extension/app/src/nft.code.ts @@ -0,0 +1,6 @@ + +export const NftCode: { __type: 'NftCode', protocol: string, code: object[] } = { + __type: 'NftCode', + protocol: 'PtEdo2ZkT9oKpimTah6x2embF25oss54njMuPzkJTEi5RqfdZFA', + code: JSON.parse(`[{"prim":"parameter","args":[{"prim":"or","args":[{"prim":"pair","annots":["%mint"],"args":[{"prim":"nat"},{"prim":"bytes"},{"prim":"bytes"},{"prim":"bytes"},{"prim":"bytes"}]},{"prim":"or","args":[{"prim":"list","annots":["%update_operators"],"args":[{"prim":"or","args":[{"prim":"pair","annots":["%add_operator"],"args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}]},{"prim":"pair","annots":["%remove_operator"],"args":[{"prim":"address","annots":["%owner"]},{"prim":"address","annots":["%operator"]},{"prim":"nat","annots":["%token_id"]}]}]}]},{"prim":"or","args":[{"prim":"pair","annots":["%balance_of"],"args":[{"prim":"list","annots":["%requests"],"args":[{"prim":"pair","args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}]}]},{"prim":"contract","annots":["%callback"],"args":[{"prim":"list","args":[{"prim":"pair","args":[{"prim":"pair","annots":["%request"],"args":[{"prim":"address","annots":["%owner"]},{"prim":"nat","annots":["%token_id"]}]},{"prim":"nat","annots":["%balance"]}]}]}]}]},{"prim":"list","annots":["%transfer"],"args":[{"prim":"pair","args":[{"prim":"address","annots":["%from_"]},{"prim":"list","annots":["%txs"],"args":[{"prim":"pair","args":[{"prim":"address","annots":["%to_"]},{"prim":"nat","annots":["%token_id"]},{"prim":"nat","annots":["%amount"]}]}]}]}]}]}]}]}]},{"prim":"storage","args":[{"prim":"pair","args":[{"prim":"set","annots":["%administrators"],"args":[{"prim":"address"}]},{"prim":"big_map","annots":["%ledger"],"args":[{"prim":"nat"},{"prim":"address"}]},{"prim":"big_map","annots":["%metadata"],"args":[{"prim":"string"},{"prim":"bytes"}]},{"prim":"big_map","annots":["%token_metadata"],"args":[{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat","annots":["%token_id"]},{"prim":"map","annots":["%token_info"],"args":[{"prim":"string"},{"prim":"bytes"}]}]}]},{"prim":"big_map","annots":["%operators"],"args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"address"}]},{"prim":"set","args":[{"prim":"nat"}]}]}]}]},{"prim":"code","args":[[{"prim":"LAMBDA","args":[{"prim":"address"},{"prim":"unit"},[{"prim":"PUSH","args":[{"prim":"string"},{"string":"The sender can only manage operators for his own token"}]},{"prim":"SENDER"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"UNIT"}],[{"prim":"FAILWITH"}]]}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"nat"},{"prim":"pair","args":[{"prim":"nat"},{"prim":"map","args":[{"prim":"string"},{"prim":"bytes"}]}]}]},{"prim":"nat"}]},{"prim":"unit"},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_TOKEN_UNDEFINED"}]},{"prim":"FAILWITH"}],[{"prim":"DROP"}]]},{"prim":"UNIT"}]]},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"nat"},{"prim":"address"}]},{"prim":"nat"},{"prim":"address"}]},{"prim":"bool"},[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"option is None"}]},{"prim":"FAILWITH"}],[]]},{"prim":"COMPARE"},{"prim":"EQ"}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"UNPAIR"},{"prim":"IF_LEFT","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP","args":[{"int":"3"}]},{"prim":"UNPAIR","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"CAR"},{"prim":"SENDER"},{"prim":"MEM"},{"prim":"NOT"},{"prim":"IF","args":[[{"prim":"DROP","args":[{"int":"6"}]},{"prim":"PUSH","args":[{"prim":"string"},{"string":"1"}]},{"prim":"FAILWITH"}],[{"prim":"DUP","args":[{"int":"6"}]},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"SENDER"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"SWAP"},{"prim":"SOME"},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"7"}]},{"prim":"EMPTY_MAP","args":[{"prim":"string"},{"prim":"bytes"}]},{"prim":"PUSH","args":[{"prim":"bytes"},{"bytes":"30"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"decimals"}]},{"prim":"UPDATE"},{"prim":"DIG","args":[{"int":"6"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"symbol"}]},{"prim":"UPDATE"},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"thumbnailUri"}]},{"prim":"UPDATE"},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"displayUri"}]},{"prim":"UPDATE"},{"prim":"DIG","args":[{"int":"6"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"artifactUri"}]},{"prim":"UPDATE"},{"prim":"PUSH","args":[{"prim":"bytes"},{"bytes":"5b22545a49502d3132225d"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"interfaces"}]},{"prim":"UPDATE"},{"prim":"DIG","args":[{"int":"5"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"description"}]},{"prim":"UPDATE"},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"SOME"},{"prim":"PUSH","args":[{"prim":"string"},{"string":"name"}]},{"prim":"UPDATE"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"PAIR"},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"SOME"},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"UPDATE","args":[{"int":"7"}]},{"prim":"EMPTY_BIG_MAP","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"address"}]},{"prim":"set","args":[{"prim":"nat"}]}]},{"prim":"UPDATE","args":[{"int":"8"}]},{"prim":"NIL","args":[{"prim":"operation"}]},{"prim":"PAIR"}]]}],[{"prim":"IF_LEFT","args":[[{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"7"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"GET","args":[{"int":"8"}]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"PAIR","args":[{"int":"4"}]},{"prim":"DUP"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"SWAP"},{"prim":"LAMBDA","args":[{"prim":"pair","args":[{"prim":"lambda","args":[{"prim":"address"},{"prim":"unit"}]},{"prim":"pair","args":[{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"address"}]},{"prim":"set","args":[{"prim":"nat"}]}]},{"prim":"or","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"address"},{"prim":"nat"}]},{"prim":"pair","args":[{"prim":"address"},{"prim":"address"},{"prim":"nat"}]}]}]}]},{"prim":"big_map","args":[{"prim":"pair","args":[{"prim":"address"},{"prim":"address"}]},{"prim":"set","args":[{"prim":"nat"}]}]},[{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"UNPAIR"},{"prim":"SWAP"},{"prim":"IF_LEFT","args":[[{"prim":"DUP"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"SWAP"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP","args":[{"int":"4"}]}],[{"prim":"DUP"},{"prim":"DIG","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"4"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"True"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"UPDATE"}]]}],[{"prim":"DUP"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CAR"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"SWAP"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP","args":[{"int":"4"}]}],[{"prim":"DUP"},{"prim":"DIG","args":[{"int":"5"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"nat"}]}]}],[{"prim":"DIG","args":[{"int":"4"}]},{"prim":"GET","args":[{"int":"4"}]},{"prim":"PUSH","args":[{"prim":"bool"},{"prim":"False"}]},{"prim":"SWAP"},{"prim":"UPDATE"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"SIZE"},{"prim":"COMPARE"},{"prim":"EQ"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"NONE","args":[{"prim":"set","args":[{"prim":"nat"}]}]}],[{"prim":"SOME"}]]}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"PAIR"},{"prim":"UPDATE"}]]}]]}]]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"APPLY"},{"prim":"DIG","args":[{"int":"5"}]},{"prim":"DROP"},{"prim":"SWAP"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"ITER","args":[[{"prim":"SWAP"},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"SWAP"},{"prim":"EXEC"}]]},{"prim":"SWAP"},{"prim":"DROP"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"NIL","args":[{"prim":"operation"}]},{"prim":"PAIR"},{"prim":"SWAP"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"CAR"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"6"}]},{"prim":"UPDATE","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"5"}]},{"prim":"UPDATE","args":[{"int":"7"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"UPDATE","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"CAR"}],[{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP"},{"prim":"IF_LEFT","args":[[{"prim":"DUP","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"7"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"GET","args":[{"int":"8"}]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"PAIR","args":[{"int":"4"}]},{"prim":"SWAP"},{"prim":"UNPAIR"},{"prim":"MAP","args":[[{"prim":"DUP"},{"prim":"UNPAIR"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"9"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"0"}]},{"prim":"SWAP"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"CAR"},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"7"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"IF","args":[[{"prim":"DROP"},{"prim":"PUSH","args":[{"prim":"nat"},{"int":"1"}]}],[]]},{"prim":"SWAP"},{"prim":"PAIR"}]]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DIG","args":[{"int":"5"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"SWAP"},{"prim":"PUSH","args":[{"prim":"mutez"},{"int":"0"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"TRANSFER_TOKENS"},{"prim":"SWAP"},{"prim":"NIL","args":[{"prim":"operation"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"CONS"},{"prim":"PAIR"},{"prim":"SWAP"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"CAR"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"6"}]},{"prim":"UPDATE","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"5"}]},{"prim":"UPDATE","args":[{"int":"7"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"UPDATE","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"CAR"}],[{"prim":"DUP","args":[{"int":"2"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"GET","args":[{"int":"7"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"GET","args":[{"int":"8"}]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"PAIR","args":[{"int":"4"}]},{"prim":"DUP"},{"prim":"CAR"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"ITER","args":[[{"prim":"UNPAIR"},{"prim":"DUG","args":[{"int":"2"}]},{"prim":"ITER","args":[[{"prim":"UNPAIR","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"DROP"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"5"}]},{"prim":"PAIR"},{"prim":"DUP","args":[{"int":"9"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"DROP"},{"prim":"SENDER"},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"COMPARE"},{"prim":"NEQ"},{"prim":"IF","args":[[{"prim":"DUP","args":[{"int":"6"}]},{"prim":"GET","args":[{"int":"3"}]},{"prim":"SWAP"},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"PAIR"},{"prim":"GET"},{"prim":"IF_NONE","args":[[{"prim":"EMPTY_SET","args":[{"prim":"nat"}]}],[]]},{"prim":"DUP","args":[{"int":"3"}]},{"prim":"MEM"},{"prim":"NOT"},{"prim":"IF","args":[[{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_NOT_OPERATOR"}]},{"prim":"FAILWITH"}],[]]}],[{"prim":"DROP"}]]},{"prim":"PUSH","args":[{"prim":"string"},{"string":"FA2_INSUFFICIENT_BALANCE"}]},{"prim":"DUP","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"4"}]},{"prim":"DUP","args":[{"int":"6"}]},{"prim":"PAIR","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"9"}]},{"prim":"SWAP"},{"prim":"EXEC"},{"prim":"IF","args":[[{"prim":"DROP"}],[{"prim":"FAILWITH"}]]},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"SWAP"},{"prim":"SOME"},{"prim":"DIG","args":[{"int":"2"}]},{"prim":"UPDATE"}]]},{"prim":"SWAP"},{"prim":"DROP"}]]},{"prim":"DIG","args":[{"int":"3"}]},{"prim":"DIG","args":[{"int":"4"}]},{"prim":"DROP","args":[{"int":"2"}]},{"prim":"UPDATE","args":[{"int":"1"}]},{"prim":"NIL","args":[{"prim":"operation"}]},{"prim":"PAIR"},{"prim":"SWAP"},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"CAR"},{"prim":"UPDATE","args":[{"int":"3"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"6"}]},{"prim":"UPDATE","args":[{"int":"5"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"5"}]},{"prim":"UPDATE","args":[{"int":"7"}]},{"prim":"DUP","args":[{"int":"2"}]},{"prim":"CDR"},{"prim":"GET","args":[{"int":"3"}]},{"prim":"UPDATE","args":[{"int":"8"}]},{"prim":"SWAP"},{"prim":"CAR"}]]}]]},{"prim":"PAIR"}]]}]]}]`) +}; diff --git a/solution_extension/app/src/nft.types.ts b/solution_extension/app/src/nft.types.ts new file mode 100644 index 0000000..eb52263 --- /dev/null +++ b/solution_extension/app/src/nft.types.ts @@ -0,0 +1,91 @@ + +import { ContractAbstractionFromContractType, WalletContractAbstractionFromContractType } from './type-utils'; +import { address, BigMap, bytes, contract, MMap, nat } from './type-aliases'; + +export type Storage = { + administrators: Array
; + ledger: BigMap; + metadata: BigMap; + token_metadata: BigMap; + }>; + operators: BigMap<{ + 0: address; + 1: address; + }, Array>; +}; + +type Methods = { + mint: ( + _0: nat, + _1: bytes, + _2: bytes, + _3: bytes, + _4: bytes, + ) => Promise; + add_operator: ( + owner: address, + operator: address, + token_id: nat, + ) => Promise; + remove_operator: ( + owner: address, + operator: address, + token_id: nat, + ) => Promise; + balance_of: ( + requests: Array<{ + owner: address; + token_id: nat; + }>, + callback: contract, + ) => Promise; + transfer: (param: Array<{ + from_: address; + txs: Array<{ + to_: address; + token_id: nat; + amount: nat; + }>; + }>) => Promise; +}; + +type MethodsObject = { + mint: (params: { + 0: nat, + 1: bytes, + 2: bytes, + 3: bytes, + 4: bytes, + }) => Promise; + add_operator: (params: { + owner: address, + operator: address, + token_id: nat, + }) => Promise; + remove_operator: (params: { + owner: address, + operator: address, + token_id: nat, + }) => Promise; + balance_of: (params: { + requests: Array<{ + owner: address; + token_id: nat; + }>, + callback: contract, + }) => Promise; + transfer: (param: Array<{ + from_: address; + txs: Array<{ + to_: address; + token_id: nat; + amount: nat; + }>; + }>) => Promise; +}; + +type contractTypes = { methods: Methods, methodsObject: MethodsObject, storage: Storage, code: { __type: 'NftCode', protocol: string, code: object[] } }; +export type NftContractType = ContractAbstractionFromContractType; +export type NftWalletType = WalletContractAbstractionFromContractType; diff --git a/solution_extension/app/src/nodeSpecific.ts b/solution_extension/app/src/nodeSpecific.ts new file mode 100644 index 0000000..df951db --- /dev/null +++ b/solution_extension/app/src/nodeSpecific.ts @@ -0,0 +1,3 @@ +import { Buffer } from "buffer"; + +globalThis.Buffer = Buffer; diff --git a/solution_extension/app/src/type-aliases.ts b/solution_extension/app/src/type-aliases.ts new file mode 100644 index 0000000..bee4df9 --- /dev/null +++ b/solution_extension/app/src/type-aliases.ts @@ -0,0 +1,97 @@ + +import { assertMichelsonInstruction, Expr, MichelsonCode } from '@taquito/michel-codec'; +import { MichelsonMap } from '@taquito/taquito'; +import { BigNumber } from 'bignumber.js'; + +export type Instruction = MichelsonCode; + +export type unit = (true | undefined) & { __type: 'unit' }; + +export type address = string & { __type: 'address' }; +export type bytes = string & { __type: 'bytes' }; +export type contract = string & { __type: 'contract' }; +export type operation = string & { __type: 'operation' }; +export type key = string & { __type: 'key' }; +export type key_hash = string & { __type: 'key_hash' }; +export type signature = string & { __type: 'signature' }; +export type ticket = string & { __type: 'ticket' }; + +export type timestamp = string & { __type: 'timestamp' }; + +export type int = BigNumber & { __type: 'int' }; +export type nat = BigNumber & { __type: 'nat' }; + +export type mutez = BigNumber & { __type: 'mutez' }; +export type tez = BigNumber & { __type: 'tez' }; + +type MapKey = Array | object | string | boolean | number; +export type MMap = Omit, 'get'> & { get: (key: K) => V }; +export type BigMap = Omit, 'get'> & { get: (key: K) => Promise }; + +export type chest = string & { __type: 'chest' }; +export type chest_key = string & { __type: 'chest_key' }; + +const createStringTypeTas = () => { + return (value: string): T => value as T; +}; + +const createBigNumberTypeTas = () => { + return (value: number | BigNumber | string): T => new BigNumber(value) as T; +}; + +type asMapParamOf = K extends string ? { [key: string]: V } | Array<{ key: K; value: V }> + : K extends number ? { [key: number]: V } | Array<{ key: K; value: V }> + : Array<{ key: K; value: V }>; + +function asMap(value: asMapParamOf): MMap { + const m = new MichelsonMap(); + if (Array.isArray(value)) { + const vArray = value as Array<{ key: K; value: V }>; + vArray.forEach(x => m.set(x.key, x.value)); + } else { + const vObject = value as { [key: string]: V }; + Object.keys(vObject).forEach(key => m.set(key as unknown as K, vObject[key])); + } + return m as MMap; +} +const asBigMap = (value: asMapParamOf) => asMap(value) as unknown as BigMap; + +function add(a: T, b: T): T { + return a.plus(b) as T; +} +function subtract(a: T, b: T): T { + return a.minus(b) as T; +} + +function createLambdaTypeTas(expr: Expr): MichelsonCode { + assertMichelsonInstruction(expr); + return expr as MichelsonCode; +} + +/** tas: Tezos 'as' casting for strict types */ +export const tas = { + address: createStringTypeTas
(), + bytes: createStringTypeTas(), + contract: createStringTypeTas(), + chest: createStringTypeTas(), + chest_key: createStringTypeTas(), + timestamp: (value: string | Date): timestamp => new Date(value).toISOString() as timestamp, + + int: createBigNumberTypeTas(), + nat: createBigNumberTypeTas(), + mutez: createBigNumberTypeTas(), + tez: createBigNumberTypeTas(), + + map: asMap, + bigMap: asBigMap, + + // Operations + add, + subtract, + + lambda: createLambdaTypeTas, + + // To number + number: (value: string | BigNumber) => Number(value + ''), + unit: () => true as unit, +}; diff --git a/solution_extension/app/src/type-utils.ts b/solution_extension/app/src/type-utils.ts new file mode 100644 index 0000000..7b05548 --- /dev/null +++ b/solution_extension/app/src/type-utils.ts @@ -0,0 +1,36 @@ + +import { ContractAbstraction, ContractMethod, ContractMethodObject, ContractProvider, Wallet } from '@taquito/taquito'; + +type BaseContractType = { methods: unknown, methodsObject: unknown, storage: unknown }; + +type ContractMethodsOf = { +[M in keyof TContract['methods']]: +TContract['methods'][M] extends (...args: infer A) => unknown +? (...args: A) => ContractMethod +: never +}; +type ContractMethodsObjectsOf = { +[M in keyof TContract['methodsObject']]: +TContract['methodsObject'][M] extends (...args: infer A) => unknown +? (...args: A) => ContractMethodObject +: never +}; +type ContractStorageOf = TContract['storage']; + +export type ContractAbstractionFromContractType = + ContractAbstraction, + ContractMethodsObjectsOf, + {}, + {}, + ContractStorageOf + >; + +export type WalletContractAbstractionFromContractType = + ContractAbstraction, + ContractMethodsObjectsOf, + {}, + {}, + ContractStorageOf + >; diff --git a/solution_extension/app/src/vite-env.d.ts b/solution_extension/app/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/solution_extension/app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/solution_extension/app/tsconfig.json b/solution_extension/app/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/solution_extension/app/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/solution_extension/app/tsconfig.node.json b/solution_extension/app/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/solution_extension/app/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/solution_extension/app/vite.config.ts b/solution_extension/app/vite.config.ts new file mode 100644 index 0000000..c22b080 --- /dev/null +++ b/solution_extension/app/vite.config.ts @@ -0,0 +1,19 @@ +import react from "@vitejs/plugin-react-swc"; +import { defineConfig } from "vite"; + +// https://vitejs.dev/config/ +export default defineConfig({ + define: { + global: {}, + }, + plugins: [react()], + resolve: { + alias: { + stream: "stream-browserify", + os: "os-browserify/browser", + util: "util", + process: "process/browser", + buffer: "buffer", + }, + }, +}); diff --git a/solution_extension/app/yarn.lock b/solution_extension/app/yarn.lock new file mode 100644 index 0000000..46db740 --- /dev/null +++ b/solution_extension/app/yarn.lock @@ -0,0 +1,3922 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@airgap/beacon-blockchain-substrate@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-blockchain-substrate/-/beacon-blockchain-substrate-4.0.6.tgz#25a45e63e2ff4f1bd0fcf569a0796c4f92940a39" + integrity sha512-6tP2Y/67fc/U8JPoMpYspvb9NSw2NfHPOYLchmf+y1VO1ybK9cSr3mWPLWoomjAyEWPpY9ymVzflEsnQMVDiXQ== + dependencies: + "@airgap/beacon-types" "4.0.6" + "@airgap/beacon-ui" "4.0.6" + +"@airgap/beacon-blockchain-tezos@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-blockchain-tezos/-/beacon-blockchain-tezos-4.0.6.tgz#f0546a41e87b492f5be6aa504a641245563699b4" + integrity sha512-YLGWSHkhmkC4KomW15bj2MRDGROQxn8oBlN2MJ1N+2CwLmEEEo4WPsIgBNuRhfUdM1/toOAiHICy5v7g98jieQ== + dependencies: + "@airgap/beacon-types" "4.0.6" + "@airgap/beacon-ui" "4.0.6" + +"@airgap/beacon-core@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-core/-/beacon-core-4.0.2.tgz#3f94fbec9c86ff99659e789b70e1684db450234e" + integrity sha512-a6mAn6BfbejBQI95tRc6pIZ0VS6MTK9MZ7iXPTLF9hrnCHiROmrCgNKst8qp2dcE0Ehk7z/hGs2WliJzi657YA== + dependencies: + "@airgap/beacon-types" "4.0.2" + "@airgap/beacon-utils" "4.0.2" + "@stablelib/ed25519" "^1.0.3" + "@stablelib/nacl" "^1.0.4" + "@stablelib/utf8" "^1.0.1" + "@stablelib/x25519-session" "^1.0.4" + bs58check "2.1.2" + +"@airgap/beacon-core@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-core/-/beacon-core-4.0.6.tgz#024c3424fc7fa85ce361345be5beb87a034647a8" + integrity sha512-gSyA1rEZ9Rphbr575UgYNnEAcVAYaZ1AGo/7m4xmvyNVAi906BPfnfpsrH8HfsDZRcnW+ahMd+YElA6a2tesmw== + dependencies: + "@airgap/beacon-types" "4.0.6" + "@airgap/beacon-utils" "4.0.6" + "@stablelib/ed25519" "^1.0.3" + "@stablelib/nacl" "^1.0.4" + "@stablelib/utf8" "^1.0.1" + "@stablelib/x25519-session" "^1.0.4" + bs58check "2.1.2" + +"@airgap/beacon-dapp@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-dapp/-/beacon-dapp-4.0.2.tgz#783c28faa98f30427b5e5b3551dd10570de71588" + integrity sha512-7vjvcM470GPfDkizYpuUzJ7Fus7X/zkFeXYTkxx69Dt5TlmKg09YNfRtvrFMDbf4OKnjbaRfVhqzwfYkpaRbPg== + dependencies: + "@airgap/beacon-core" "4.0.2" + "@airgap/beacon-transport-matrix" "4.0.2" + "@airgap/beacon-transport-postmessage" "4.0.2" + "@airgap/beacon-transport-walletconnect" "4.0.2" + "@airgap/beacon-ui" "4.0.2" + +"@airgap/beacon-dapp@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-dapp/-/beacon-dapp-4.0.6.tgz#ace0726547a7a733958b249ffb39c4dfef42d364" + integrity sha512-4+AgPopWWjwxVJcpLXTlRGb/5jdkc0MUjBvtH6kZJfhf2drsdWUkBtGHCiqpy8KjLLOiyVgdGniNTFt4025hsg== + dependencies: + "@airgap/beacon-core" "4.0.6" + "@airgap/beacon-transport-matrix" "4.0.6" + "@airgap/beacon-transport-postmessage" "4.0.6" + "@airgap/beacon-transport-walletconnect" "4.0.6" + "@airgap/beacon-ui" "4.0.6" + +"@airgap/beacon-sdk@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-sdk/-/beacon-sdk-4.0.6.tgz#05411a87137cc0836f94a4c2f028136ac32c9656" + integrity sha512-fY3V/oK6W7G3dZlgTd+zJOQkaMtageolBviH7PjqhAbAztlK0GNrateJg53Z7ZLIGVIoS4jZ7nAMfBR5Ll+Nyg== + dependencies: + "@airgap/beacon-blockchain-substrate" "4.0.6" + "@airgap/beacon-blockchain-tezos" "4.0.6" + "@airgap/beacon-core" "4.0.6" + "@airgap/beacon-dapp" "4.0.6" + "@airgap/beacon-transport-matrix" "4.0.6" + "@airgap/beacon-transport-postmessage" "4.0.6" + "@airgap/beacon-types" "4.0.6" + "@airgap/beacon-ui" "4.0.6" + "@airgap/beacon-utils" "4.0.6" + "@airgap/beacon-wallet" "4.0.6" + +"@airgap/beacon-transport-matrix@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-transport-matrix/-/beacon-transport-matrix-4.0.2.tgz#deae15cf467c89726df6665428e671d7f8e275c6" + integrity sha512-sidXWA9QkcdpTLObsgMIIePq2+6eHn8djSK2UeoAWZpVOky+jpaIU78UlzqgDzMrO9inzu/xwsuXlk5Nmy1RyA== + dependencies: + "@airgap/beacon-core" "4.0.2" + "@airgap/beacon-utils" "4.0.2" + axios "0.24.0" + +"@airgap/beacon-transport-matrix@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-transport-matrix/-/beacon-transport-matrix-4.0.6.tgz#e2e041ad366b3ad3d4a305da7ff7cb8f5b020309" + integrity sha512-wLla13DorVGadc4fG5S/o1EijwpTKIADP0DhGGD33bQc5s/59BFNSPAo3ZErZqD7+5vn7JTRKN4V/JUigsX+ZA== + dependencies: + "@airgap/beacon-core" "4.0.6" + "@airgap/beacon-utils" "4.0.6" + axios "0.24.0" + +"@airgap/beacon-transport-postmessage@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-transport-postmessage/-/beacon-transport-postmessage-4.0.2.tgz#002a922bf707b6d77b59d97e6225b2c6d8020910" + integrity sha512-UDHigcIRD5/VdKX3YDj+CVHYWafYg3N8nHT5yQ2JOU5nsQhD2y5NNNp/7U7I44CcD4OeK9d2slV+lnp8lBYe1g== + dependencies: + "@airgap/beacon-core" "4.0.2" + "@airgap/beacon-types" "4.0.2" + "@airgap/beacon-utils" "4.0.2" + +"@airgap/beacon-transport-postmessage@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-transport-postmessage/-/beacon-transport-postmessage-4.0.6.tgz#2978d1fdbdb7bb33b861ad052f4c65347fbfb520" + integrity sha512-lEwh3bLEOHnvjqA2ffaYxiIfcHLjnk0CzKW3CsvA5RJaMMZATNYj63HKC85K1SQZmy5EPReqGrjg7NpohC/TKw== + dependencies: + "@airgap/beacon-core" "4.0.6" + "@airgap/beacon-types" "4.0.6" + "@airgap/beacon-utils" "4.0.6" + +"@airgap/beacon-transport-walletconnect@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-transport-walletconnect/-/beacon-transport-walletconnect-4.0.2.tgz#ced84f173a5fc4be5cc88503346612694dca250f" + integrity sha512-t4ZrgyImVf8UIhVa6ei/p1STVKNdRq5WSoop8eTSqArIHVj4zk2dr5J0ihbe64UyLAX1O0Z7yV+dUVoH+kVWGw== + dependencies: + "@airgap/beacon-core" "4.0.2" + "@airgap/beacon-types" "4.0.2" + "@airgap/beacon-utils" "4.0.2" + "@walletconnect/sign-client" "2.7.0" + +"@airgap/beacon-transport-walletconnect@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-transport-walletconnect/-/beacon-transport-walletconnect-4.0.6.tgz#1ef37a9198c829376e61eb6ad4c52da7e2f4eadc" + integrity sha512-/YxGCbhw8JqkyEYGd7mCa5greMYO9/Ro+61xQv1/3WjT/wlTYFDF0tuH+Di6ZxVz7SBk8e95bQsKL5u10poGoA== + dependencies: + "@airgap/beacon-core" "4.0.6" + "@airgap/beacon-types" "4.0.6" + "@airgap/beacon-utils" "4.0.6" + "@walletconnect/sign-client" "^2.9.0" + +"@airgap/beacon-types@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-types/-/beacon-types-4.0.2.tgz#031fd61f6c5b63cdbe4b42d737223942ea738c00" + integrity sha512-MWbE+350Yd7aICBEwTVIkty/YmKO5eTDsMbReUCNH8qf64gGhj/ZXEN6FPwMab+qKdmACgCkmbbtAXGGtmjwrA== + dependencies: + "@types/chrome" "0.0.163" + +"@airgap/beacon-types@4.0.6", "@airgap/beacon-types@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-types/-/beacon-types-4.0.6.tgz#55ea00ddbc71ea4686833dcebd2fcfc12ad32302" + integrity sha512-9hBUts03MdYAp0IdNnXbLO1JDZd3jNXyez4ahht0jv396aPc27ZKAcWKBjkZCMbxQwpw9/pZVAmkLCErYNMSww== + dependencies: + "@types/chrome" "0.0.163" + +"@airgap/beacon-ui@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-ui/-/beacon-ui-4.0.2.tgz#3268f7a001b6499c020d051c91f209f3126022fe" + integrity sha512-ZTcvdQ5GNlQ58M0Fduoq/KqsulBXeBN6jKiHnzHM3e98syy953DKQoDhU2NXNZiJ7AvEGO3s/fd+BN8y/+CVuQ== + dependencies: + "@airgap/beacon-core" "4.0.2" + "@airgap/beacon-transport-postmessage" "4.0.2" + "@airgap/beacon-types" "4.0.2" + "@airgap/beacon-utils" "4.0.2" + qrcode-svg "^1.1.0" + solid-js "^1.6.6" + +"@airgap/beacon-ui@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-ui/-/beacon-ui-4.0.6.tgz#fa3ee1bee6c6e0ba0dd828c1d6364657c0e709cf" + integrity sha512-wid0hxsR4QrB8se1/ID7H8O9BVL3VrLUjTEIMqaXPNyDa+p53FNTVq+CGeKJ8dz/IcjjZrRB7ZTRlYVTxgqP5A== + dependencies: + "@airgap/beacon-core" "4.0.6" + "@airgap/beacon-transport-postmessage" "4.0.6" + "@airgap/beacon-types" "4.0.6" + "@airgap/beacon-utils" "4.0.6" + qrcode-svg "^1.1.0" + solid-js "^1.6.6" + +"@airgap/beacon-utils@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@airgap/beacon-utils/-/beacon-utils-4.0.2.tgz#6f255b03a2d0f868f19495f25a28d362bc9ffeca" + integrity sha512-5TfOI3ZolQQ9WNHogEO3SY4M2Paqbb3hf8DvolFofST6Brp0qyxkwZ0i99puahgwRo+B0qGilZpkLCYl72DMQg== + dependencies: + "@stablelib/ed25519" "^1.0.3" + "@stablelib/nacl" "^1.0.3" + "@stablelib/random" "^1.0.2" + "@stablelib/utf8" "^1.0.1" + bs58check "2.1.2" + +"@airgap/beacon-utils@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-utils/-/beacon-utils-4.0.6.tgz#5f1662f1ebf1297b839807fd1909717335e0c740" + integrity sha512-vV6xtS50Qd/VzJPeoK3y14ddSR+9AEV0HtmP7BcYC5jTN2flT+PlTO8y8vS0+Yx8eFnQTnlS2vp7a2DTa/aWUA== + dependencies: + "@stablelib/ed25519" "^1.0.3" + "@stablelib/nacl" "^1.0.3" + "@stablelib/random" "^1.0.2" + "@stablelib/utf8" "^1.0.1" + bs58check "2.1.2" + +"@airgap/beacon-wallet@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@airgap/beacon-wallet/-/beacon-wallet-4.0.6.tgz#f098027eb58c01ed55ca04ebbea1b6694a46c29e" + integrity sha512-m3jJvWB7JAl/Dehn8i8dRN0e6+NSNRVpzDxfO7nDedQiuPKmgcFPmenP87zF51spXDHKTkK4t7YU4HGDYR2Xrw== + dependencies: + "@airgap/beacon-core" "4.0.6" + "@airgap/beacon-transport-matrix" "4.0.6" + "@airgap/beacon-transport-postmessage" "4.0.6" + +"@apidevtools/json-schema-ref-parser@9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz#5d9000a3ac1fd25404da886da6b266adcd99cf1c" + integrity sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg== + dependencies: + "@jsdevtools/ono" "^7.1.3" + call-me-maybe "^1.0.1" + js-yaml "^3.13.1" + +"@apidevtools/openapi-schemas@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17" + integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== + +"@apidevtools/swagger-methods@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" + integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== + +"@apidevtools/swagger-parser@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz#a987d71e5be61feb623203be0c96e5985b192ab6" + integrity sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw== + dependencies: + "@apidevtools/json-schema-ref-parser" "9.0.6" + "@apidevtools/openapi-schemas" "^2.1.0" + "@apidevtools/swagger-methods" "^3.0.2" + "@jsdevtools/ono" "^7.1.3" + ajv "^8.6.3" + ajv-draft-04 "^1.0.0" + call-me-maybe "^1.0.1" + +"@babel/code-frame@^7.0.0": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" + integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== + dependencies: + "@babel/highlight" "^7.22.10" + chalk "^2.4.2" + +"@babel/helper-module-imports@^7.16.7": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/highlight@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" + integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/runtime@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" + integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/types@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" + integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.11.1": + version "11.11.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" + integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + +"@eslint/eslintrc@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93" + integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@^8.46.0": + version "8.46.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6" + integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA== + +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.1.1.tgz#006ab8b33b1aec6d2992c75e5918c65197388aa2" + integrity sha512-Pd7+aGvWIaTDL5ecV4ZBEtBrjXnk8/ly5xyHbikxVhgcq7qhihzHWHbcYmFupQBT2A5ggNZGvT7Bpj0M6AKHjA== + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== + +"@mui/base@5.0.0-beta.9": + version "5.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.9.tgz#e88d7052aa6d97c1e57d5ce2a4e2edf898db90ec" + integrity sha512-gm6gnPnc/lS5Z3neH0iuOrK7IbS02+oh6KsMtXYLhI6bJpHs+PNWFsBmISx7x4FSPVJZvZkb8Bw6pEXpIMFt7Q== + dependencies: + "@babel/runtime" "^7.22.6" + "@emotion/is-prop-valid" "^1.2.1" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.3" + "@popperjs/core" "^2.11.8" + clsx "^2.0.0" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/core-downloads-tracker@^5.14.3": + version "5.14.3" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.3.tgz#474689f4d691993376e8a1ca07e08d4545275082" + integrity sha512-QxvrcDqphZoXRjsAmCaQylmWjC/8/qKWwIde1MJMna5YIst3R9O0qhKRPu36/OE2d8AeTbCVjRcRvNqhhW8jyg== + +"@mui/icons-material@^5.14.3": + version "5.14.3" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.3.tgz#26a84d52ab2fceea2856adf7a139527b3a51ae90" + integrity sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw== + dependencies: + "@babel/runtime" "^7.22.6" + +"@mui/material@^5.14.3": + version "5.14.3" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.3.tgz#c88dbc270c4ebde32f9956b9b3cbf8a5d1dc7aef" + integrity sha512-dlu4SOcCp9Cy+wkcfZ/ns9ZkP40nr/WPgqxX0HmrE0o+dkE1ropY9BbHsLrTlYJCko8yzcC8bLghrD4xqZG1og== + dependencies: + "@babel/runtime" "^7.22.6" + "@mui/base" "5.0.0-beta.9" + "@mui/core-downloads-tracker" "^5.14.3" + "@mui/system" "^5.14.3" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.3" + "@types/react-transition-group" "^4.4.6" + clsx "^2.0.0" + csstype "^3.1.2" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.13.7": + version "5.13.7" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.13.7.tgz#2f8ef5da066f3c6c6423bd4260d003a28d10b099" + integrity sha512-qbSr+udcij5F9dKhGX7fEdx2drXchq7htLNr2Qg2Ma+WJ6q0ERlEqGSBiPiVDJkptcjeVL4DGmcf1wl5+vD4EA== + dependencies: + "@babel/runtime" "^7.22.5" + "@mui/utils" "^5.13.7" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.13.2": + version "5.13.2" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.13.2.tgz#c87bd61c0ab8086d34828b6defe97c02bcd642ef" + integrity sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw== + dependencies: + "@babel/runtime" "^7.21.0" + "@emotion/cache" "^11.11.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/system@^5.14.3": + version "5.14.3" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.3.tgz#71aa88433649a23dfa5c102cef8a3c5b1ac40ac6" + integrity sha512-b+C+j9+75+/iIYSa+1S4eCMc9MDNrj9hzWfExJqS2GffuNocRagjBZFyjtMqsLWLxMxQIX8Cg6j0hAioiw+WfQ== + dependencies: + "@babel/runtime" "^7.22.6" + "@mui/private-theming" "^5.13.7" + "@mui/styled-engine" "^5.13.2" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.3" + clsx "^2.0.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/types@^7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" + integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== + +"@mui/utils@^5.13.7", "@mui/utils@^5.14.3": + version "5.14.3" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.3.tgz#76d8151c23d2c2a871e98b90add57a8fd01d5d80" + integrity sha512-gZ6Etw+ppO43GYc1HFZSLjwd4DoZoa+RrYTD25wQLfzcSoPjVoC/zZqA2Lkq0zjgwGBQOSxKZI6jfp9uXR+kgw== + dependencies: + "@babel/runtime" "^7.22.6" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^18.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@remix-run/router@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.7.2.tgz#cba1cf0a04bc04cb66027c51fa600e9cbc388bc8" + integrity sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A== + +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/blake2b@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/blake2b/-/blake2b-1.0.1.tgz#0045a77e182c4cf3260bc9b533fc4cd5c287f8ea" + integrity sha512-B3KyKoBAjkIFeH7romcF96i+pVFYk7K2SBQ1pZvaxV+epSBXJ+n0C66esUhyz6FF+5FbdQVm77C5fzGFcEZpKA== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/ed25519@^1.0.2", "@stablelib/ed25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996" + integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== + dependencies: + "@stablelib/random" "^1.0.2" + "@stablelib/sha512" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/nacl@^1.0.3", "@stablelib/nacl@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@stablelib/nacl/-/nacl-1.0.4.tgz#b63e0a1b87eccb13ad91dd46b2382112acfa417e" + integrity sha512-PJ2U/MrkXSKUM8C4qFs87WeCNxri7KQwR8Cdwm9q2sweGuAtTvOJGuW0F3N+zn+ySLPJA98SYWSSpogMJ1gCmw== + dependencies: + "@stablelib/poly1305" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + "@stablelib/x25519" "^1.0.3" + "@stablelib/xsalsa20" "^1.0.2" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/salsa20@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/salsa20/-/salsa20-1.0.2.tgz#95177331f89a59d1c90f153f53265c925d4de138" + integrity sha512-nfjKzw0KTKrrKBasEP+j7UP4I8Xudom8lVZIBCp0kQNARXq72IlSic0oabg2FC1NU68L4RdHrNJDd8bFwrphYA== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha512@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha512/-/sha512-1.0.1.tgz#6da700c901c2c0ceacbd3ae122a38ac57c72145f" + integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/utf8@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/utf8/-/utf8-1.0.1.tgz#fd5e7ad353b7e3cd1ce85e49099360e57693cfd1" + integrity sha512-FrYD1xadah/TtAP6VJ04lDD5h9rdDj/d8wH/jMYTtHqZBv9z2btdvEU8vTxdjdkFmo1b/BH+t3R1wi/mYhCCNg== + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519-session@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@stablelib/x25519-session/-/x25519-session-1.0.4.tgz#b89177ec5fb16493cdf485a1913f8f268da80af0" + integrity sha512-UZw67EJWSNTaou7Qp086fzGek7crrCQl2K7MoqEzslXxrm6vybySfcdsqaZ0ZpKq19IHWK8G0wAlFBy70srm3w== + dependencies: + "@stablelib/blake2b" "^1.0.1" + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + "@stablelib/x25519" "^1.0.3" + +"@stablelib/x25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/xsalsa20@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/xsalsa20/-/xsalsa20-1.0.2.tgz#89efc22a7ba432880ef11d876fdeba13529ccdc4" + integrity sha512-7XdBGbcNgBShmuhDXv1G1WPVCkjZdkb1oPMzSidO7Fve0MHntH6TjFkj5bfLI+aRE+61weO076vYpP/jmaAYog== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/salsa20" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + +"@swc/core-darwin-arm64@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.75.tgz#f6b2fb9dd03839ff3153902e09f1772963a1bbb6" + integrity sha512-anDnx9L465lGbjB2mvcV54NGHW6illr0IDvVV7JmkabYUVneaRdQvTr0tbHv3xjHnjrK1wuwVOHKV0LcQF2tnQ== + +"@swc/core-darwin-x64@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.75.tgz#b5a4fcc668f15fe664c9bdddac12b7c0685e6c81" + integrity sha512-dIHDfrLmeZfr2xwi1whO7AmzdI3HdamgvxthaL+S8L1x8TeczAZEvsmZTjy3s8p3Va4rbGXcb3+uBhmfkqCbfw== + +"@swc/core-linux-arm-gnueabihf@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.75.tgz#a4b19babc256390790b50d75dd300a3201275f9f" + integrity sha512-qeJmvMGrjC6xt+G0R4kVqqxvlhxJx7tTzhcEoWgLJnfvGZiF6SJdsef4OSM7HuReXrlBoEtJbfGPrLJtbV+C0w== + +"@swc/core-linux-arm64-gnu@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.75.tgz#347e44d12a3fd71e9fc109b68a7fff81696ecbc3" + integrity sha512-sqA9JqHEJBF4AdNuwo5zRqq0HC3l31SPsG9zpRa4nRzG5daBBJ80H7fi6PZQud1rfNNq+Q08gjYrdrxwHstvjw== + +"@swc/core-linux-arm64-musl@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.75.tgz#ca21e597ff52c0a25848be1838cd923a32963584" + integrity sha512-95rQT5xTAL3eKhMJbJbLsZHHP9EUlh1rcrFoLf0gUApoVF8g94QjZ9hYZiI72mMP5WPjgTEXQVnVB9O2GxeaLw== + +"@swc/core-linux-x64-gnu@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.75.tgz#56abe19475a72bdc5333461b55ca3c2cd60e4611" + integrity sha512-If7UpAhnPduMmtC+TSgPpZ1UXZfp2hIpjUFxpeCmHHYLS6Fn/2GZC5hpEiu+wvFJF0hzPh93eNAHa9gUxGUG+w== + +"@swc/core-linux-x64-musl@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.75.tgz#bfa90d24071930effeb4514540f89266a6d6957a" + integrity sha512-HOhxX0YNHTElCZqIviquka3CGYTN8rSQ6BdFfSk/K0O+ZEHx3qGte0qr+gGLPF/237GxreUkp3OMaWKuURtuCg== + +"@swc/core-win32-arm64-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.75.tgz#2fd8ea75ffe1a9153c523b6135b7169266a60e54" + integrity sha512-7QPI+mvBXAerVfWahrgBNe+g7fK8PuetxFnZSEmXUcDXvWcdJXAndD7GjAJzbDyjQpLKHbsDKMiHYvfNxZoN/A== + +"@swc/core-win32-ia32-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.75.tgz#9dae46582027ffeb03f258d05ab797701250d465" + integrity sha512-EfABCy4Wlq7O5ShWsm32FgDkSjyeyj/SQ4wnUIvWpkXhgfT1iNXky7KRU1HtX+SmnVk/k/NnabVZpIklYbjtZA== + +"@swc/core-win32-x64-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.75.tgz#c8e6d30c5deed1ae0fa162a42d6d9ef165b8041f" + integrity sha512-cTvP0pOD9C3pSp1cwtt85ZsrUkQz8RZfSPhM+jCGxKxmoowDCnInoOQ4Ica/ehyuUnQ4/IstSdYtYpO5yzPDJg== + +"@swc/core@^1.3.61": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.75.tgz#b06d32144a5be0b7b25dbbff09dcd1ab18e48b67" + integrity sha512-YLqd5oZVnaOq/OzkjRSsJUQqAfKYiD0fzUyVUPVlNNCoQEfVfSMcXH80hLmYe9aDH0T/a7qEMjWyIr/0kWqy1A== + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.75" + "@swc/core-darwin-x64" "1.3.75" + "@swc/core-linux-arm-gnueabihf" "1.3.75" + "@swc/core-linux-arm64-gnu" "1.3.75" + "@swc/core-linux-arm64-musl" "1.3.75" + "@swc/core-linux-x64-gnu" "1.3.75" + "@swc/core-linux-x64-musl" "1.3.75" + "@swc/core-win32-arm64-msvc" "1.3.75" + "@swc/core-win32-ia32-msvc" "1.3.75" + "@swc/core-win32-x64-msvc" "1.3.75" + +"@taquito/beacon-wallet@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/beacon-wallet/-/beacon-wallet-17.1.1.tgz#1fecfee21f1b1e6ac30297f4b954af72d85e9a9f" + integrity sha512-Ogjlcm1rycD3Qkv/9JmY1IyMXpTXtCQ7wUc7nHHI+kH0vVoCt3DHWSE/7haaIJsYH4l6jasqTHk/fKT+2ayEiQ== + dependencies: + "@airgap/beacon-dapp" "4.0.2" + "@taquito/core" "^17.1.1" + "@taquito/taquito" "^17.1.1" + +"@taquito/core@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/core/-/core-17.1.1.tgz#7961991a2d63d0dffa1cc046456277874b058377" + integrity sha512-ib+dzHbVT+0maYGAVdeIk9v9CNkOiB5j8CwnHUygBkEajoOdWTPlsrldRhRTAOnbj+iQk0kdkUECD6KY6iNknw== + +"@taquito/http-utils@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/http-utils/-/http-utils-17.1.1.tgz#a9ceeda1c8186e0a9044990564b9bf971abfa59c" + integrity sha512-Bp0MifEqXHln9MWI6v/3rMNlO5N5mTpN+AbA/8uQeIKoDg3/H9yoxihg91TB1rhaG81PqyqxuF3OQ+/rvDmIxg== + dependencies: + "@taquito/core" "^17.1.1" + axios "0.26.0" + +"@taquito/local-forging@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/local-forging/-/local-forging-17.1.1.tgz#dee729b120d418108a075af7faf7efbdc5761701" + integrity sha512-CP5+24QNffvRh2SymYs0POZl001FdbwezEZBWnMdQkI3oKoOqmMYeTprhi/lYOb3oK7Y7kF0FBUhN2CfTt3Itw== + dependencies: + "@taquito/core" "^17.1.1" + "@taquito/utils" "^17.1.1" + bignumber.js "^9.1.0" + +"@taquito/michel-codec@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/michel-codec/-/michel-codec-17.1.1.tgz#c1bb15a36dc46d19a443b7b05278f580382c020b" + integrity sha512-f21XWLa1PMovCgJTLo3jKUHdeonkeBt9JD6QFY5gIUi4uWdA6UYTst23P0YkIENmB4YXnO50wz/rrEjeyAhHeQ== + dependencies: + "@taquito/core" "^17.1.1" + +"@taquito/michelson-encoder@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/michelson-encoder/-/michelson-encoder-17.1.1.tgz#7346f0aee41f7718bf5592c83fc2b60a02b75c9d" + integrity sha512-pQUJslapmOQorwLcy8wvaZIpq6I1taeva0avL9u3jo7aM3ZENozL1/BYPlCYA7jtEYvuuw2hCRqyxzg41HqWXw== + dependencies: + "@taquito/rpc" "^17.1.1" + "@taquito/utils" "^17.1.1" + bignumber.js "^9.1.0" + fast-json-stable-stringify "^2.1.0" + +"@taquito/rpc@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/rpc/-/rpc-17.1.1.tgz#d6c51307ebbb97ab089554064019eb0f6754d995" + integrity sha512-yJ2LZYc65GMk0XdOHFFIora7I1Q4XeYG/5oH8n8HoSQIeuwFhjSBGnrwWr5fQf503lKmjHyiuftziY4mkVumGg== + dependencies: + "@taquito/core" "^17.1.1" + "@taquito/http-utils" "^17.1.1" + "@taquito/utils" "^17.1.1" + bignumber.js "^9.1.0" + +"@taquito/taquito@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/taquito/-/taquito-17.1.1.tgz#2735054c2fd3cf4f013d06c735fd9538802d1916" + integrity sha512-BjkjaoaXVdi92ImDfsh9jRpXTD/4NrFcaB4PcpPpfdtX/jIa2098MIH9Zdm/MdPmy9rtaZcHRej4B+BWJJ7JXg== + dependencies: + "@taquito/core" "^17.1.1" + "@taquito/http-utils" "^17.1.1" + "@taquito/local-forging" "^17.1.1" + "@taquito/michel-codec" "^17.1.1" + "@taquito/michelson-encoder" "^17.1.1" + "@taquito/rpc" "^17.1.1" + "@taquito/utils" "^17.1.1" + bignumber.js "^9.1.0" + rxjs "^7.8.1" + +"@taquito/tzip12@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/tzip12/-/tzip12-17.1.1.tgz#247b84757c46a046063667de5f5885b5e42a4a20" + integrity sha512-xruY9jWca0VlFSZSLWctx3WKpB8Y5uyjso3Tz0wtrVXpgim4CyrSqM9sgdSkIVlbzuzzaZ0ExQ/zrqeeWE6sMA== + dependencies: + "@taquito/michelson-encoder" "^17.1.1" + "@taquito/taquito" "^17.1.1" + "@taquito/tzip16" "^17.1.1" + +"@taquito/tzip16@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/tzip16/-/tzip16-17.1.1.tgz#d4cb6aa027f796c4eba03e0bc2245441c94f2e86" + integrity sha512-X3Yu6UUL/x+HHzXwTrqOr04bU4nhNyHBOSz7C40HVjSlx83IZcCxCzoD7Jm15Mg1zg40hKxG0xgY48bs4vPuGQ== + dependencies: + "@taquito/http-utils" "^17.1.1" + "@taquito/michelson-encoder" "^17.1.1" + "@taquito/rpc" "^17.1.1" + "@taquito/taquito" "^17.1.1" + "@taquito/utils" "^17.1.1" + bignumber.js "^9.1.0" + crypto-js "^4.1.1" + +"@taquito/utils@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@taquito/utils/-/utils-17.1.1.tgz#9b7993df3fe0aac328a9805c9e8d26f860ae6efb" + integrity sha512-KcK7Qa2+SCcevxSJixA3utDtlPYS5DGXpZdMlrAjwjozMiuDGSLM63D1CrW/ojYI0t3tPuErty10cPhURZ+d4A== + dependencies: + "@stablelib/blake2b" "^1.0.1" + "@stablelib/ed25519" "^1.0.3" + "@taquito/core" "^17.1.1" + "@types/bs58check" "^2.1.0" + bignumber.js "^9.1.0" + blakejs "^1.2.1" + bs58check "^2.1.2" + buffer "^6.0.3" + elliptic "^6.5.4" + typedarray-to-buffer "^4.0.0" + +"@types/bs58check@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/bs58check/-/bs58check-2.1.0.tgz#7d25a8b88fe7a9e315d2647335ee3c43c8fdb0c0" + integrity sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ== + dependencies: + "@types/node" "*" + +"@types/chrome@0.0.163": + version "0.0.163" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.163.tgz#6ff2fc9e8a160ea0655f6c62b4c2210757c42aab" + integrity sha512-g+3E2tg/ukFsEgH+tB3a/b+J1VSvq/8gh2Jwih9eq+T3Idrz7ngj97u+/ya58Bfei2TQtPlRivj1FsCaSnukDA== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + +"@types/filesystem@*": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf" + integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee" + integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== + +"@types/har-format@*": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.11.tgz#26aff34e9c782b2648cc45778abadcd930f7db43" + integrity sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ== + +"@types/json-schema@^7.0.12": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/node@*": + version "20.4.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.8.tgz#b5dda19adaa473a9bf0ab5cbd8f30ec7d43f5c85" + integrity sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*", "@types/prop-types@^15.7.5": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react-dom@^18.2.7": + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== + dependencies: + "@types/react" "*" + +"@types/react-is@^18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-18.2.1.tgz#61d01c2a6fc089a53520c0b66996d458fdc46863" + integrity sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw== + dependencies: + "@types/react" "*" + +"@types/react-swipeable-views@^0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@types/react-swipeable-views/-/react-swipeable-views-0.13.2.tgz#c37cc8978ae60ab0dff209ef3eb1f77185aef330" + integrity sha512-FiszBm9M0JicAgzO/IwDqpfHQRUEjPZA88UexYsVD6qHJBf5LrbGjR5Mw4+yZbf8ZxJneNqOsZbe4WGjOYG7iQ== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.6": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.15": + version "18.2.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.19.tgz#f77cb2c8307368e624d464a25b9675fa35f95a8b" + integrity sha512-e2S8wmY1ePfM517PqCG80CcE48Xs5k0pwJzuDZsfE8IZRRBfOMCF+XqnFxu6mWtyivum1MQm4aco+WIt6Coimw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@typescript-eslint/eslint-plugin@^6.0.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz#e751e148aab7ccaf8a7bfd370f7ce9e6bdd1f3f4" + integrity sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.3.0" + "@typescript-eslint/type-utils" "6.3.0" + "@typescript-eslint/utils" "6.3.0" + "@typescript-eslint/visitor-keys" "6.3.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + natural-compare-lite "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.0.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.3.0.tgz#359684c443f4f848db3c4f14674f544f169c8f46" + integrity sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg== + dependencies: + "@typescript-eslint/scope-manager" "6.3.0" + "@typescript-eslint/types" "6.3.0" + "@typescript-eslint/typescript-estree" "6.3.0" + "@typescript-eslint/visitor-keys" "6.3.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz#6b74e338c4b88d5e1dfc1a28c570dd5cf8c86b09" + integrity sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ== + dependencies: + "@typescript-eslint/types" "6.3.0" + "@typescript-eslint/visitor-keys" "6.3.0" + +"@typescript-eslint/type-utils@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz#3bf89ccd36621ddec1b7f8246afe467c67adc247" + integrity sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ== + dependencies: + "@typescript-eslint/typescript-estree" "6.3.0" + "@typescript-eslint/utils" "6.3.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.3.0.tgz#84517f1427923e714b8418981e493b6635ab4c9d" + integrity sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg== + +"@typescript-eslint/typescript-estree@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz#20e1e10e2f51cdb9e19a2751215cac92c003643c" + integrity sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg== + dependencies: + "@typescript-eslint/types" "6.3.0" + "@typescript-eslint/visitor-keys" "6.3.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.3.0.tgz#0898c5e374372c2092ca1b979ea7ee9cc020ce84" + integrity sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.3.0" + "@typescript-eslint/types" "6.3.0" + "@typescript-eslint/typescript-estree" "6.3.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz#8d09aa3e389ae0971426124c155ac289afbe450a" + integrity sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw== + dependencies: + "@typescript-eslint/types" "6.3.0" + eslint-visitor-keys "^3.4.1" + +"@tzkt/oazapfts@^4.5.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@tzkt/oazapfts/-/oazapfts-4.5.2.tgz#4ede4ad497d2827c211e5498f74c01120fd16236" + integrity sha512-swGzinGddQL6S40CY5X7OC5B1zYZLSKsDXnqI1YIgOQ9iXA91OT/jaB1HpQ2BHaExG24h5SaxckDL/WnlwM00w== + dependencies: + "@apidevtools/swagger-parser" "^10.1.0" + lodash "^4.17.21" + minimist "^1.2.7" + swagger2openapi "^7.0.8" + typescript "^4.9.3" + +"@tzkt/sdk-api@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@tzkt/sdk-api/-/sdk-api-2.2.1.tgz#7f0743d3e8d36a18ffe013098c1ae34b9da0bfe0" + integrity sha512-WV4Dw6x1dSDC4PvdUi6lnQCxaeDsuzCkCMiLD5+fPufEB6GhQ1c5l2xN49boy/CJn4Ghr4VSh5/2eCKItEkPqQ== + dependencies: + "@tzkt/oazapfts" "^4.5.2" + +"@vitejs/plugin-react-swc@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz#34a82c1728066f48a86dfecb2f15df60f89207fb" + integrity sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA== + dependencies: + "@swc/core" "^1.3.61" + +"@walletconnect/core@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.7.0.tgz#26f19710958648e401968ab2fd427d6b07fb3b37" + integrity sha512-xUeFPpElybgn1a+lknqtHleei4VyuV/4qWgB1nP8qQUAO6a5pNsioODrnB2VAPdUHJYBdx2dCt2maRk6g53IPQ== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "^1.0.12" + "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/jsonrpc-ws-connection" "^1.0.11" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.7.0" + "@walletconnect/utils" "2.7.0" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + +"@walletconnect/core@2.9.2": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.9.2.tgz#c46734ca63771b28fd77606fd521930b7ecfc5e1" + integrity sha512-VARMPAx8sIgodeyngDHbealP3B621PQqjqKsByFUTOep8ZI1/R/20zU+cmq6j9RCrL+kLKZcrZqeVzs8Z7OlqQ== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.13" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.9.2" + "@walletconnect/utils" "2.9.2" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== + dependencies: + tslib "1.14.1" + +"@walletconnect/events@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" + integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== + dependencies: + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" + +"@walletconnect/heartbeat@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" + integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-provider@1.0.13", "@walletconnect/jsonrpc-provider@^1.0.12": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" + integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" + integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== + dependencies: + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" + +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" + integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== + dependencies: + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.3" + tslib "1.14.1" + +"@walletconnect/jsonrpc-ws-connection@1.0.13", "@walletconnect/jsonrpc-ws-connection@^1.0.11": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.13.tgz#23b0cdd899801bfbb44a6556936ec2b93ef2adf4" + integrity sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + tslib "1.14.1" + ws "^7.5.1" + +"@walletconnect/keyvaluestorage@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz#92f5ca0f54c1a88a093778842ce0c874d86369c8" + integrity sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ== + dependencies: + safe-json-utils "^1.1.1" + tslib "1.14.1" + +"@walletconnect/logger@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" + integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== + dependencies: + pino "7.11.0" + tslib "1.14.1" + +"@walletconnect/relay-api@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" + integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== + dependencies: + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/relay-auth@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" + integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + uint8arrays "^3.0.0" + +"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" + integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== + dependencies: + tslib "1.14.1" + +"@walletconnect/sign-client@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.7.0.tgz#c08c90a1fc95340d5d40d2cfd88f59d4d385a676" + integrity sha512-K99xa6GSFS04U+140yrIEi/VJJJ0Q1ov4jCaiqa9euILDKxlBsM7m5GR+9sq6oYyj18SluJY4CJTdeOXUJlarA== + dependencies: + "@walletconnect/core" "2.7.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.7.0" + "@walletconnect/utils" "2.7.0" + events "^3.3.0" + +"@walletconnect/sign-client@^2.9.0": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.9.2.tgz#ff4c81c082c2078878367d07f24bcb20b1f7ab9e" + integrity sha512-anRwnXKlR08lYllFMEarS01hp1gr6Q9XUgvacr749hoaC/AwGVlxYFdM8+MyYr3ozlA+2i599kjbK/mAebqdXg== + dependencies: + "@walletconnect/core" "2.9.2" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.9.2" + "@walletconnect/utils" "2.9.2" + events "^3.3.0" + +"@walletconnect/time@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" + integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== + dependencies: + tslib "1.14.1" + +"@walletconnect/types@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.7.0.tgz#af639c463d0d80d0fd03da80f2fc593c73a93ae9" + integrity sha512-aMUDUtO79WSBtC/bDetE6aFwdgwJr0tJ8nC8gnAl5ELsrjygEKCn6M8Q+v6nP9svG9yf5Rds4cImxCT6BWwTyw== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/types@2.9.2": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.9.2.tgz#d5fd5a61dc0f41cbdca59d1885b85207ac7bf8c5" + integrity sha512-7Rdn30amnJEEal4hk83cdwHUuxI1SWQ+K7fFFHBMqkuHLGi3tpMY6kpyfDxnUScYEZXqgRps4Jo5qQgnRqVM7A== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/utils@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.7.0.tgz#18482834b8a27e0515ef160a1ff7e4632c9d77f5" + integrity sha512-k32jrQeyJsNZPdmtmg85Y3QgaS5YfzYSPrAxRC2uUD1ts7rrI6P5GG2iXNs3AvWKOuCgsp/PqU8s7AC7CRUscw== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.7.0" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.1" + uint8arrays "^3.1.0" + +"@walletconnect/utils@2.9.2": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.9.2.tgz#035bdb859ee81a4bcc6420f56114cc5ec3e30afb" + integrity sha512-D44hwXET/8JhhIjqljY6qxSu7xXnlPrf63UN/Qfl98vDjWlYVcDl2+JIQRxD9GPastw0S8XZXdRq59XDXLuZBg== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.9.2" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/window-getters@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== + dependencies: + tslib "1.14.1" + +"@walletconnect/window-metadata@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" + integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== + dependencies: + "@walletconnect/window-getters" "^1.0.1" + tslib "1.14.1" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +ajv-draft-04@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.6.3: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +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" + +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" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + +axios@0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928" + integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== + dependencies: + follow-redirects "^1.14.8" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.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" + +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== + +bignumber.js@^9.1.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + +blakejs@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +bs58@^4.0.0: + 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" + +bs58check@2.1.2, bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^6.0.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" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + +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== + +chalk@^2.4.2: + 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" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +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" + +clsx@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +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== + +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.5.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== + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^7.0.2: + 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" + +crypto-browserify@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + +csstype@^3.0.2, csstype@^3.1.0, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +debug@^4.1.1, debug@^4.3.2, 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" + +decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" + integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== + +define-properties@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-browser@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" + integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +duplexify@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + +elliptic@^6.5.3, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +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-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== + +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + +esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-refresh@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz#59dae8c00a119f06ea16b1d3e6891df3775947c7" + integrity sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" + integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== + +eslint@^8.45.0: + version "8.46.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552" + integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.1" + "@eslint/js" "^8.46.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.2" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +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== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "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-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, 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-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-redact@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +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" + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.14.4, follow-redirects@^1.14.8: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +formik@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.3.tgz#6020e85eb3e3e8415b3b19d6f4f65793ab754b24" + integrity sha512-2Dy79Szw3zlXmZiokUdKsn+n1ow4G8hRrC/n92cOWHNTWXCRpQXlyvz6HcjW7aSQZrldytvDOavYjhfmDnUq8Q== + dependencies: + deepmerge "^2.1.1" + hoist-non-react-statics "^3.3.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + react-fast-compare "^2.0.1" + tiny-warning "^1.0.2" + tslib "^2.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== + +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-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +goober@^2.0.33: + version "2.1.13" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.13.tgz#e3c06d5578486212a76c9eba860cbc3232ff6d7c" + integrity sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +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-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +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== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.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, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-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-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +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-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-typed-array@^1.1.3: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +"js-tokens@^3.0.0 || ^4.0.0", 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" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-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-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +keycode@^2.1.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.1.tgz#09c23b2be0611d26117ea2501c2c391a01f39eff" + integrity sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg== + +keyvaluestorage-interface@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" + integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +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@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.isequal@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +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" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +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" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +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== + +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +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== + +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.1: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + +notistack@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/notistack/-/notistack-3.0.1.tgz#daf59888ab7e2c30a1fa8f71f9cba2978773236e" + integrity sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA== + dependencies: + clsx "^1.1.0" + goober "^2.0.33" + +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^5.0.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-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +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.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== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +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.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== + dependencies: + duplexify "^4.1.2" + split2 "^4.0.0" + +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + +postcss@^8.4.27: + version "8.4.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" + integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-expr@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" + integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qrcode-svg@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/qrcode-svg/-/qrcode-svg-1.1.0.tgz#2087549843dc5d0a3f8e8aa046cd9bcf23708cc3" + integrity sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw== + +qs@^6.11.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +query-string@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.1.tgz#754620669db978625a90f635f12617c271a088e1" + integrity sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +query-string@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== + dependencies: + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-event-listener@^0.6.0: + version "0.6.6" + resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" + integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== + dependencies: + "@babel/runtime" "^7.2.0" + prop-types "^15.6.0" + warning "^4.0.1" + +react-fast-compare@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-router-dom@^6.14.2: + version "6.14.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.14.2.tgz#88f520118b91aa60233bd08dbd3fdcaea3a68488" + integrity sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg== + dependencies: + "@remix-run/router" "1.7.2" + react-router "6.14.2" + +react-router@6.14.2: + version "6.14.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.14.2.tgz#1f60994d8c369de7b8ba7a78d8f7ec23df76b300" + integrity sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ== + dependencies: + "@remix-run/router" "1.7.2" + +react-swipeable-views-core@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.14.0.tgz#6ac443a7cc7bc5ea022fbd549292bb5fff361cce" + integrity sha512-0W/e9uPweNEOSPjmYtuKSC/SvKKg1sfo+WtPdnxeLF3t2L82h7jjszuOHz9C23fzkvLfdgkaOmcbAxE9w2GEjA== + dependencies: + "@babel/runtime" "7.0.0" + warning "^4.0.1" + +react-swipeable-views-utils@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.14.0.tgz#6b76e251906747482730c22002fe47ab1014ba32" + integrity sha512-W+fXBOsDqgFK1/g7MzRMVcDurp3LqO3ksC8UgInh2P/tKgb5DusuuB1geKHFc6o1wKl+4oyER4Zh3Lxmr8xbXA== + dependencies: + "@babel/runtime" "7.0.0" + keycode "^2.1.7" + prop-types "^15.6.0" + react-event-listener "^0.6.0" + react-swipeable-views-core "^0.14.0" + shallow-equal "^1.2.1" + +react-swipeable-views@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.14.0.tgz#149c0df3d92220cc89e3f6d5c04a78dfe46f9b54" + integrity sha512-wrTT6bi2nC3JbmyNAsPXffUXLn0DVT9SbbcFr36gKpbaCgEp7rX/OFxsu5hPc/NBsUhHyoSRGvwqJNNrWTwCww== + dependencies: + "@babel/runtime" "7.0.0" + prop-types "^15.5.4" + react-swipeable-views-core "^0.14.0" + react-swipeable-views-utils "^0.14.0" + warning "^4.0.1" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== + +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +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== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.19.0: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup@^3.27.1: + version "3.27.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.27.2.tgz#59adc973504408289be89e5978e938ce852c9520" + integrity sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-json-utils@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" + integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ== + +safe-stable-stringify@^2.1.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +seroval@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/seroval/-/seroval-0.5.1.tgz#e6d17365cdaaae7e50815c7e0bcd7102facdadf3" + integrity sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-equal@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + +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== + +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.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" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +solid-js@^1.6.6: + version "1.7.9" + resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.7.9.tgz#eb666d1c0ab0322bf844b566edbf40557dee66c7" + integrity sha512-p1orXnauMQmwYULZtuPAXyKNRGEN2qh60kLX4YURa3jvulxAqjlh2kWEljXCtAVR6UZPC16NXdj9ASHcH383Fg== + dependencies: + csstype "^3.1.0" + seroval "^0.5.0" + +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== + dependencies: + atomic-sleep "^1.0.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +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== + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + +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" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-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== + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +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-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== + +swagger2openapi@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +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== + +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== + dependencies: + real-require "^0.1.0" + +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +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" + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-api-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.1.tgz#8144e811d44c749cd65b2da305a032510774452d" + integrity sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A== + +tslib@1.14.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.0, tslib@^2.1.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +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" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +typedarray-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz#cdd2933c61dd3f5f02eda5d012d441f95bfeb50a" + integrity sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ== + +typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +typescript@^5.0.2: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +uint8arrays@^3.0.0, uint8arrays@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== + dependencies: + punycode "^1.4.1" + qs "^6.11.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.0: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +vite@^4.4.5: + version "4.4.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d" + integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== + dependencies: + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" + optionalDependencies: + fsevents "~2.3.2" + +warning@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-typed-array@^1.1.11, which-typed-array@^1.1.2: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +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== + +ws@^7.5.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +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== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.1.1: + 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.0.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + 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.1.1" + +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== + +yup@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/yup/-/yup-1.2.0.tgz#9e51af0c63bdfc9be0fdc6c10aa0710899d8aff6" + integrity sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ== + dependencies: + property-expr "^2.0.5" + tiny-case "^1.0.3" + toposort "^2.0.2" + type-fest "^2.19.0" diff --git a/solution_extension/contracts/nft.jsligo b/solution_extension/contracts/nft.jsligo new file mode 100644 index 0000000..1496056 --- /dev/null +++ b/solution_extension/contracts/nft.jsligo @@ -0,0 +1,148 @@ +//#import "@ligo/fa/lib/fa2/nft/nft.impl.jsligo" "FA2Impl" +#import "@ligo/fa/lib/fa2/nft/extendable_nft.impl.jsligo" "FA2Impl" + + +/* ERROR MAP FOR UI DISPLAY or TESTS + const errorMap : map = Map.literal(list([ + ["0", "Enter a positive and not null amount"], + ["1", "Operation not allowed, you need to be administrator"], + ["2", "You cannot sell more than your current balance"], + ["3", "Cannot find the offer you entered for buying"], + ["4", "You entered a quantity to buy than is more than the offer quantity"], + ["5", "Not enough funds, you need to pay at least quantity * offer price to get the tokens"], + ["6", "Cannot find the contract relative to implicit address"], + ])); + */ + +export type storage = FA2Impl.storage; + +/* + administrators: set
, + ledger: FA2Impl.ledger, + metadata: FA2Impl.TZIP16.metadata, + token_metadata: FA2Impl.TZIP12.tokenMetadata, + operators: FA2Impl.operators, + extension : int +};*/ + +type ret = [list, storage]; + +@entry +const transfer = (p: FA2Impl.TZIP12.transfer, s: storage): ret => { + const ret2: [list, FA2Impl.storage] = + FA2Impl.transfer( + p, + { + ledger: s.ledger, + metadata: s.metadata, + token_metadata: s.token_metadata, + operators: s.operators, + extension + } + ); + return [ + ret2[0], + { + ...s, + ledger: ret2[1].ledger, + metadata: ret2[1].metadata, + token_metadata: ret2[1].token_metadata, + operators: ret2[1].operators, + + } + ] +}; + +@entry +const balance_of = (p: FA2Impl.TZIP12.balance_of, s: storage): ret => { + const ret2: [list, FA2Impl.storage] = + FA2Impl.balance_of( + p, + { + ledger: s.ledger, + metadata: s.metadata, + token_metadata: s.token_metadata, + operators: s.operators, + extension + } + ); + return [ + ret2[0], + { + ...s, + ledger: ret2[1].ledger, + metadata: ret2[1].metadata, + token_metadata: ret2[1].token_metadata, + operators: ret2[1].operators, + } + ] +}; + +@entry +const update_operators = (p: FA2Impl.TZIP12.update_operators, s: storage): ret => { + const ret2: [list, FA2Impl.storage] = + FA2Impl.update_operators( + p, + { + ledger: s.ledger, + metadata: s.metadata, + token_metadata: s.token_metadata, + operators: s.operators, + extension + } + ); + return [ + ret2[0], + { + ...s, + ledger: ret2[1].ledger, + metadata: ret2[1].metadata, + token_metadata: ret2[1].token_metadata, + operators: ret2[1].operators, + } + ] +}; + + +@entry +const mint = ( + [token_id, name, description, symbol, ipfsUrl]: [ + nat, + bytes, + bytes, + bytes, + bytes + ], + s: storage +): ret => { + if (! Set.mem(Tezos.get_sender(), s.administrators)) return failwith("1"); + const token_info: map = + Map.literal( + list( + [ + ["name", name], + ["description", description], + ["interfaces", (bytes `["TZIP-12"]`)], + ["artifactUri", ipfsUrl], + ["displayUri", ipfsUrl], + ["thumbnailUri", ipfsUrl], + ["symbol", symbol], + ["decimals", (bytes `0`)] + ] + ) + ) as map; + return [ + list([]) as list, + { + ...s, + ledger: Big_map.add(token_id, Tezos.get_sender(), s.ledger) as + FA2Impl.ledger, + token_metadata: Big_map.add( + token_id, + { token_id: token_id, token_info: token_info }, + s.token_metadata + ), + operators: Big_map.empty as FA2Impl.operators + } + ] +}; diff --git a/solution_extension/contracts/nft.parameterList.jsligo b/solution_extension/contracts/nft.parameterList.jsligo new file mode 100644 index 0000000..418053e --- /dev/null +++ b/solution_extension/contracts/nft.parameterList.jsligo @@ -0,0 +1,6 @@ +#import "nft.jsligo" "Contract" + +// When this file was created, the smart contract was defined with an entrypoint using `@entry` that was not within a namespace. As such, the examples below are written with that assumption in mind. + +// IMPORTANT: We suggest always explicitly typing your parameter values: +// E.g.: `const parameter: int = 10` or `const parameter: Contract.parameter = 10` \ No newline at end of file diff --git a/solution_extension/contracts/nft.storageList.jsligo b/solution_extension/contracts/nft.storageList.jsligo new file mode 100644 index 0000000..40cbc06 --- /dev/null +++ b/solution_extension/contracts/nft.storageList.jsligo @@ -0,0 +1,35 @@ +#import "nft.jsligo" "Contract" + +const default_storage: Contract.storage = { + administrators: Set.literal( + list(["tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb" as address]) + ) as set
, + ledger: Big_map.empty as Contract.FA2Impl.ledger, + metadata: Big_map.literal( + list( + [ + ["", bytes `tezos-storage:data`], + [ + "data", + bytes + `{ + "name":"FA2 NFT Marketplace", + "description":"Example of FA2 implementation", + "version":"0.0.1", + "license":{"name":"MIT"}, + "authors":["Marigold"], + "homepage":"https://marigold.dev", + "source":{ + "tools":["Ligo"], + "location":"https://github.com/ligolang/contract-catalogue/tree/main/lib/fa2"}, + "interfaces":["TZIP-012"], + "errors": [], + "views": [] + }` + ] + ] + ) + ) as Contract.FA2Impl.TZIP16.metadata, + token_metadata: Big_map.empty as Contract.FA2Impl.TZIP12.tokenMetadata, + operators: Big_map.empty as Contract.FA2Impl.operators, +}; diff --git a/solution_extension/ligo.esy.lock/index.json b/solution_extension/ligo.esy.lock/index.json new file mode 100644 index 0000000..4e0be59 --- /dev/null +++ b/solution_extension/ligo.esy.lock/index.json @@ -0,0 +1 @@ +{"checksum":"581270a9568e898aa218d47e4fa4c48ac7fba306","root":"app@link-dev:./ligo.json","node":{"@ligo/fa@1.1.1@ffffffff":{"id":"@ligo/fa@1.1.1@ffffffff","name":"@ligo/fa","version":"1.1.1","source":{"type":"library","source":["archive:https://packages.ligolang.org/-/api/@ligo/fa/-/@ligo/fa-1.1.1.tgz#sha1:3aeec67b0d3d08208c1044baf70eff90b5685c4e"]},"overrides":[],"dependencies":[],"devDependencies":[]},"app@link-dev:./ligo.json":{"id":"app@link-dev:./ligo.json","name":"app","version":"link-dev:./ligo.json","source":{"type":"link-dev","path":".","manifest":"ligo.json"},"overrides":[],"dependencies":["@ligo/fa@1.1.1@ffffffff"],"devDependencies":[]}}} \ No newline at end of file diff --git a/solution_extension/ligo.json b/solution_extension/ligo.json new file mode 100644 index 0000000..f7416b2 --- /dev/null +++ b/solution_extension/ligo.json @@ -0,0 +1 @@ +{ "name": "app", "dependencies": { "@ligo/fa": "^1.1.1" } } \ No newline at end of file diff --git a/solution_extension/package-lock.json b/solution_extension/package-lock.json new file mode 100644 index 0000000..73bad93 --- /dev/null +++ b/solution_extension/package-lock.json @@ -0,0 +1,2129 @@ +{ + "name": "nft-marketplace", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nft-marketplace", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@taqueria/plugin-contract-types": "^0.44.0", + "@taqueria/plugin-ligo": "^0.44.0", + "@taqueria/plugin-octez-client": "^0.42.0", + "@taqueria/plugin-taquito": "^0.42.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", + "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", + "dev": true, + "dependencies": { + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz", + "integrity": "sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==", + "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.2", + "tslib": "^2.5.0", + "webcrypto-core": "^1.7.7" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@stablelib/binary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", + "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "dev": true, + "dependencies": { + "@stablelib/int": "^1.0.1" + } + }, + "node_modules/@stablelib/blake2b": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/blake2b/-/blake2b-1.0.1.tgz", + "integrity": "sha512-B3KyKoBAjkIFeH7romcF96i+pVFYk7K2SBQ1pZvaxV+epSBXJ+n0C66esUhyz6FF+5FbdQVm77C5fzGFcEZpKA==", + "dev": true, + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/bytes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz", + "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==", + "dev": true + }, + "node_modules/@stablelib/constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz", + "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==", + "dev": true + }, + "node_modules/@stablelib/ed25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz", + "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==", + "dev": true, + "dependencies": { + "@stablelib/random": "^1.0.2", + "@stablelib/sha512": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/hash": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", + "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==", + "dev": true + }, + "node_modules/@stablelib/hmac": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz", + "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==", + "dev": true, + "dependencies": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/int": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==", + "dev": true + }, + "node_modules/@stablelib/keyagreement": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz", + "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==", + "dev": true, + "dependencies": { + "@stablelib/bytes": "^1.0.1" + } + }, + "node_modules/@stablelib/nacl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stablelib/nacl/-/nacl-1.0.4.tgz", + "integrity": "sha512-PJ2U/MrkXSKUM8C4qFs87WeCNxri7KQwR8Cdwm9q2sweGuAtTvOJGuW0F3N+zn+ySLPJA98SYWSSpogMJ1gCmw==", + "dev": true, + "dependencies": { + "@stablelib/poly1305": "^1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/wipe": "^1.0.1", + "@stablelib/x25519": "^1.0.3", + "@stablelib/xsalsa20": "^1.0.2" + } + }, + "node_modules/@stablelib/pbkdf2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/pbkdf2/-/pbkdf2-1.0.1.tgz", + "integrity": "sha512-d5jwK6jW1DkMyzqY8D1Io+fRXcsUVr95lk5LKX9ghaUdAITTc1ZL0bff+R0IrwSixbHluxhnivG7vDw59AZ/Nw==", + "dev": true, + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/hmac": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/poly1305": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz", + "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==", + "dev": true, + "dependencies": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/random": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", + "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", + "dev": true, + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/salsa20": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/salsa20/-/salsa20-1.0.2.tgz", + "integrity": "sha512-nfjKzw0KTKrrKBasEP+j7UP4I8Xudom8lVZIBCp0kQNARXq72IlSic0oabg2FC1NU68L4RdHrNJDd8bFwrphYA==", + "dev": true, + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/constant-time": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/sha512": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz", + "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==", + "dev": true, + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/wipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==", + "dev": true + }, + "node_modules/@stablelib/x25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz", + "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==", + "dev": true, + "dependencies": { + "@stablelib/keyagreement": "^1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/xsalsa20": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/xsalsa20/-/xsalsa20-1.0.2.tgz", + "integrity": "sha512-7XdBGbcNgBShmuhDXv1G1WPVCkjZdkb1oPMzSidO7Fve0MHntH6TjFkj5bfLI+aRE+61weO076vYpP/jmaAYog==", + "dev": true, + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/salsa20": "^1.0.2", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@taqueria/lib-ligo": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@taqueria/lib-ligo/-/lib-ligo-0.44.0.tgz", + "integrity": "sha512-6inxp+RPdhYj8hEoFF8GCk2rbnGra/zLn/28WYhoNhOYz6AiuzoXWnE2fXxHrQXosMYKmqRUfnP9n79iranLzw==", + "dev": true, + "dependencies": { + "@taqueria/node-sdk": "^0.44.0", + "fast-glob": "^3.3.1" + } + }, + "node_modules/@taqueria/node-sdk": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@taqueria/node-sdk/-/node-sdk-0.44.0.tgz", + "integrity": "sha512-nCkbFzO9g/+CK/xhAQBJjdADFIYAcMR4KXcQ1aJolkCTgVYjSK0e34kBk/U+MU9HGSF9j5ADG+SHSTnA16GKtA==", + "dev": true, + "dependencies": { + "@taqueria/protocol": "^0.44.0", + "@taquito/signer": "^17.3.1", + "@taquito/taquito": "^17.3.1", + "@taquito/utils": "^17.3.1", + "i18next": "^23.5.1", + "node-fetch": "^3.3.2", + "rambda": "^8.3.0", + "shell-quote": "^1.8.1", + "stacktrace-js": "^2.0.2", + "ts-pattern": "^5.0.5", + "why-is-node-running": "^2.2.2", + "yargs": "^17.7.2", + "zod": "^3.22.2" + } + }, + "node_modules/@taqueria/plugin-contract-types": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@taqueria/plugin-contract-types/-/plugin-contract-types-0.44.0.tgz", + "integrity": "sha512-tge5+0kpxq7g35dc8pZD6DYhFv68TMVLxKY8ct3EvVzZiRA6tGl8eeAzwXx0OrAHQ7QAQwLilwkA7Fb+szOBaQ==", + "dev": true, + "dependencies": { + "@taqueria/node-sdk": "^0.44.0", + "@taquito/michel-codec": "^18.0.0-RC.0", + "@taquito/signer": "^18.0.0-RC.0", + "@taquito/taquito": "^18.0.0-RC.0", + "bignumber.js": "^9.1.2", + "fast-glob": "^3.3.1" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/core": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/core/-/core-18.0.0-RC.0.tgz", + "integrity": "sha512-10TMPmBJ60ibsJCipnsDSgd9e+qk2sCmOYO9prabHXtpfw/OAHjBX5R4rAkUVAhm7YBODePesSdvppv7TaEpeA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/http-utils": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-18.0.0-RC.0.tgz", + "integrity": "sha512-KhSlw2FWdD1u4Kz8DKLtwWAu0ihbKE0KoO48dvYkfBIGCAXsHz/g/JAudGhMCGbLlP4ddF49UKO567DJkXyBeQ==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "axios": "0.26.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/local-forging": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/local-forging/-/local-forging-18.0.0-RC.0.tgz", + "integrity": "sha512-trCCK5fBLSb3g7j3HEJ+93LQ3FlU9QUfQU3DAL4DOC9tyFxzamXECrVrtRxvdVVPo1HYBUvFJb5WBZer17fuJQ==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/michel-codec": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-18.0.0-RC.0.tgz", + "integrity": "sha512-5FzMU+C8ERpQ0e5WrRsB+o5OggO/1TyL2MVmfQmqel4jn1OEbBUEQ31QqxhZBp0fqCX9n5FYOjznXafutFzK2Q==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/michelson-encoder": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-18.0.0-RC.0.tgz", + "integrity": "sha512-PeXU18uCMWwayfAFe31zhclsZrdW4+f6+PdRi5hsSYWlJ7pEPo2xambKC5gCL8jVTjqcj64BzR5crCH3xsN49Q==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/rpc": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0", + "fast-json-stable-stringify": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/rpc": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/rpc/-/rpc-18.0.0-RC.0.tgz", + "integrity": "sha512-JNvWlYHH5/kKaHoYrBmYqRuPafvars97ena1x9y4cksrapg4ZgvkAWudaVfJ9L8ahfY+IoPdmNP3G2FQ3WkeMg==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/http-utils": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/signer": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/signer/-/signer-18.0.0-RC.0.tgz", + "integrity": "sha512-nUSNlyIne5PWcA2V/m06txudMGcGmlL1IfKV29kQ5UaS4iXFXB5Qgv7DRKp2GGoaY61bJKedbbd01+QEJ0bDQQ==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@stablelib/hmac": "^1.0.1", + "@stablelib/nacl": "^1.0.4", + "@stablelib/pbkdf2": "^1.0.1", + "@stablelib/sha512": "^1.0.1", + "@taquito/core": "^18.0.0-RC.0", + "@taquito/taquito": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "@types/bn.js": "^5.1.1", + "bip39": "3.0.4", + "elliptic": "^6.5.4", + "pbkdf2": "^3.1.2", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/taquito": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/taquito/-/taquito-18.0.0-RC.0.tgz", + "integrity": "sha512-+TJSAqBmEElmLMwlNpA5UzhBtOyGYRdjqhA+A5+KvUFGXte8r/jEOlCtBHSgcZ3p+ckUVcrareaD2vUHvTnzyw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/http-utils": "^18.0.0-RC.0", + "@taquito/local-forging": "^18.0.0-RC.0", + "@taquito/michel-codec": "^18.0.0-RC.0", + "@taquito/michelson-encoder": "^18.0.0-RC.0", + "@taquito/rpc": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-contract-types/node_modules/@taquito/utils": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/utils/-/utils-18.0.0-RC.0.tgz", + "integrity": "sha512-rn/wQ6BHpfMskOp06C4Re2mqMkM1d4PtQlJT602nWNAnpEoEnIWXrJ4Dxsy3xQZxL+Jx1YTtGag9iibYcu89Zw==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@taquito/core": "^18.0.0-RC.0", + "@types/bs58check": "^2.1.0", + "bignumber.js": "^9.1.0", + "blakejs": "^1.2.1", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "elliptic": "^6.5.4", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-ligo": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@taqueria/plugin-ligo/-/plugin-ligo-0.44.0.tgz", + "integrity": "sha512-s9Eirp7s/2zogFIrmk9qhUaengyG61v5hsGZ/JsT+dVEHZV3sWE4OQhTFBBWrzAmoDqlcHQXfP1u8oxKfU+Vcw==", + "dev": true, + "dependencies": { + "@taqueria/lib-ligo": "^0.44.0", + "@taqueria/node-sdk": "^0.44.0", + "fast-glob": "^3.3.1" + } + }, + "node_modules/@taqueria/plugin-octez-client": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@taqueria/plugin-octez-client/-/plugin-octez-client-0.42.0.tgz", + "integrity": "sha512-FB+UPJtalo/tE3TVQjGWw5LfPpXCeR7wjmLfqQ4HAKKlB5+iMCTU/3DLO3wlh3TGWvuAQopynUZEVrNKiHOoEA==", + "dev": true, + "dependencies": { + "@taqueria/node-sdk": "^0.42.0", + "fast-glob": "^3.3.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-octez-client/node_modules/@taqueria/node-sdk": { + "version": "0.42.13", + "resolved": "https://registry.npmjs.org/@taqueria/node-sdk/-/node-sdk-0.42.13.tgz", + "integrity": "sha512-/T6hUzTO/MnIoWOYCscNIUn2CjLe7jgiGR4brynEc2U+wUV4UyrVPNsSfuoe21SZVEzBMbhjwd8Vl57gfDtYlA==", + "dev": true, + "dependencies": { + "@taqueria/protocol": "^0.42.13", + "@taquito/signer": "^17.3.1", + "@taquito/taquito": "^17.3.1", + "@taquito/utils": "^17.3.1", + "i18next": "^23.5.1", + "node-fetch": "^3.3.2", + "rambda": "^8.3.0", + "shell-quote": "^1.8.1", + "stacktrace-js": "^2.0.2", + "ts-pattern": "^5.0.5", + "why-is-node-running": "^2.2.2", + "yargs": "^17.7.2", + "zod": "^3.22.2" + } + }, + "node_modules/@taqueria/plugin-octez-client/node_modules/@taqueria/protocol": { + "version": "0.42.13", + "resolved": "https://registry.npmjs.org/@taqueria/protocol/-/protocol-0.42.13.tgz", + "integrity": "sha512-Q9mV3KK4ZQrDI4CJ5UkLo3X3KmRGlLZrw1xV3josbxvjOYFZ/1Z0BG905Hll/ztItcaGyy4vKSKMf01jai8G/A==", + "dev": true, + "dependencies": { + "@peculiar/webcrypto": "^1.4.3", + "batching-toposort": "^1.2.0", + "fluture": "^14.0.0", + "i18next": "^23.5.1", + "rambda": "^8.3.0", + "rambdax": "^10.0.0", + "zod": "^3.22.2" + } + }, + "node_modules/@taqueria/plugin-taquito": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@taqueria/plugin-taquito/-/plugin-taquito-0.42.0.tgz", + "integrity": "sha512-ktV89iL4MmHwBi4iQw350hVkW/P5ceChHwQV/PUhaB5nJJ8PtyWva8FBw4scjBqvZCXQiAE9JXljR5XRwDYhzg==", + "dev": true, + "dependencies": { + "@taqueria/node-sdk": "^0.42.0", + "@taquito/michel-codec": "^18.0.0-RC.0", + "@taquito/signer": "^18.0.0-RC.0", + "@taquito/taquito": "^18.0.0-RC.0", + "fast-glob": "^3.3.1", + "wtfnode": "^0.9.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taqueria/node-sdk": { + "version": "0.42.13", + "resolved": "https://registry.npmjs.org/@taqueria/node-sdk/-/node-sdk-0.42.13.tgz", + "integrity": "sha512-/T6hUzTO/MnIoWOYCscNIUn2CjLe7jgiGR4brynEc2U+wUV4UyrVPNsSfuoe21SZVEzBMbhjwd8Vl57gfDtYlA==", + "dev": true, + "dependencies": { + "@taqueria/protocol": "^0.42.13", + "@taquito/signer": "^17.3.1", + "@taquito/taquito": "^17.3.1", + "@taquito/utils": "^17.3.1", + "i18next": "^23.5.1", + "node-fetch": "^3.3.2", + "rambda": "^8.3.0", + "shell-quote": "^1.8.1", + "stacktrace-js": "^2.0.2", + "ts-pattern": "^5.0.5", + "why-is-node-running": "^2.2.2", + "yargs": "^17.7.2", + "zod": "^3.22.2" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taqueria/node-sdk/node_modules/@taquito/michel-codec": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-17.3.2.tgz", + "integrity": "sha512-js/yWXINW5w1WIDgLnTtlXcabtF/N8mt3E+laaHvHSjzxc5BMQXiWcj+vCk0JyHc9Hm/RnVK6AW326R/Bpwj3Q==", + "dev": true, + "dependencies": { + "@taquito/core": "^17.3.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taqueria/node-sdk/node_modules/@taquito/signer": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/signer/-/signer-17.3.2.tgz", + "integrity": "sha512-5lFPomhVNgAmNqiTCzCJM6QbPT3XT6HSqcjD3WQx8kM1Xi5P3sLgAMPfucRDVGp2zopZL+MBbt8juIzb7KDy5A==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@stablelib/hmac": "^1.0.1", + "@stablelib/nacl": "^1.0.4", + "@stablelib/pbkdf2": "^1.0.1", + "@stablelib/sha512": "^1.0.1", + "@taquito/core": "^17.3.2", + "@taquito/taquito": "^17.3.2", + "@taquito/utils": "^17.3.2", + "@types/bn.js": "^5.1.1", + "bip39": "3.0.4", + "elliptic": "^6.5.4", + "pbkdf2": "^3.1.2", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taqueria/node-sdk/node_modules/@taquito/taquito": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/taquito/-/taquito-17.3.2.tgz", + "integrity": "sha512-q9+9i1LwqGl8MpWKzhJVWolnRY3tmYJL7cLfLA0z73X+/tEyZB+Me5VnzIk0rfssAIyXzdQq3KV0FUuprEolyg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@taquito/core": "^17.3.2", + "@taquito/http-utils": "^17.3.2", + "@taquito/local-forging": "^17.3.2", + "@taquito/michel-codec": "^17.3.2", + "@taquito/michelson-encoder": "^17.3.2", + "@taquito/rpc": "^17.3.2", + "@taquito/utils": "^17.3.2", + "bignumber.js": "^9.1.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taqueria/protocol": { + "version": "0.42.13", + "resolved": "https://registry.npmjs.org/@taqueria/protocol/-/protocol-0.42.13.tgz", + "integrity": "sha512-Q9mV3KK4ZQrDI4CJ5UkLo3X3KmRGlLZrw1xV3josbxvjOYFZ/1Z0BG905Hll/ztItcaGyy4vKSKMf01jai8G/A==", + "dev": true, + "dependencies": { + "@peculiar/webcrypto": "^1.4.3", + "batching-toposort": "^1.2.0", + "fluture": "^14.0.0", + "i18next": "^23.5.1", + "rambda": "^8.3.0", + "rambdax": "^10.0.0", + "zod": "^3.22.2" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/michel-codec": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-18.0.0-RC.0.tgz", + "integrity": "sha512-5FzMU+C8ERpQ0e5WrRsB+o5OggO/1TyL2MVmfQmqel4jn1OEbBUEQ31QqxhZBp0fqCX9n5FYOjznXafutFzK2Q==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/michel-codec/node_modules/@taquito/core": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/core/-/core-18.0.0-RC.0.tgz", + "integrity": "sha512-10TMPmBJ60ibsJCipnsDSgd9e+qk2sCmOYO9prabHXtpfw/OAHjBX5R4rAkUVAhm7YBODePesSdvppv7TaEpeA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/signer": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/signer/-/signer-18.0.0-RC.0.tgz", + "integrity": "sha512-nUSNlyIne5PWcA2V/m06txudMGcGmlL1IfKV29kQ5UaS4iXFXB5Qgv7DRKp2GGoaY61bJKedbbd01+QEJ0bDQQ==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@stablelib/hmac": "^1.0.1", + "@stablelib/nacl": "^1.0.4", + "@stablelib/pbkdf2": "^1.0.1", + "@stablelib/sha512": "^1.0.1", + "@taquito/core": "^18.0.0-RC.0", + "@taquito/taquito": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "@types/bn.js": "^5.1.1", + "bip39": "3.0.4", + "elliptic": "^6.5.4", + "pbkdf2": "^3.1.2", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/signer/node_modules/@taquito/core": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/core/-/core-18.0.0-RC.0.tgz", + "integrity": "sha512-10TMPmBJ60ibsJCipnsDSgd9e+qk2sCmOYO9prabHXtpfw/OAHjBX5R4rAkUVAhm7YBODePesSdvppv7TaEpeA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/signer/node_modules/@taquito/utils": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/utils/-/utils-18.0.0-RC.0.tgz", + "integrity": "sha512-rn/wQ6BHpfMskOp06C4Re2mqMkM1d4PtQlJT602nWNAnpEoEnIWXrJ4Dxsy3xQZxL+Jx1YTtGag9iibYcu89Zw==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@taquito/core": "^18.0.0-RC.0", + "@types/bs58check": "^2.1.0", + "bignumber.js": "^9.1.0", + "blakejs": "^1.2.1", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "elliptic": "^6.5.4", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/taquito": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/taquito/-/taquito-18.0.0-RC.0.tgz", + "integrity": "sha512-+TJSAqBmEElmLMwlNpA5UzhBtOyGYRdjqhA+A5+KvUFGXte8r/jEOlCtBHSgcZ3p+ckUVcrareaD2vUHvTnzyw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/http-utils": "^18.0.0-RC.0", + "@taquito/local-forging": "^18.0.0-RC.0", + "@taquito/michel-codec": "^18.0.0-RC.0", + "@taquito/michelson-encoder": "^18.0.0-RC.0", + "@taquito/rpc": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/taquito/node_modules/@taquito/core": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/core/-/core-18.0.0-RC.0.tgz", + "integrity": "sha512-10TMPmBJ60ibsJCipnsDSgd9e+qk2sCmOYO9prabHXtpfw/OAHjBX5R4rAkUVAhm7YBODePesSdvppv7TaEpeA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/taquito/node_modules/@taquito/http-utils": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-18.0.0-RC.0.tgz", + "integrity": "sha512-KhSlw2FWdD1u4Kz8DKLtwWAu0ihbKE0KoO48dvYkfBIGCAXsHz/g/JAudGhMCGbLlP4ddF49UKO567DJkXyBeQ==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "axios": "0.26.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/taquito/node_modules/@taquito/local-forging": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/local-forging/-/local-forging-18.0.0-RC.0.tgz", + "integrity": "sha512-trCCK5fBLSb3g7j3HEJ+93LQ3FlU9QUfQU3DAL4DOC9tyFxzamXECrVrtRxvdVVPo1HYBUvFJb5WBZer17fuJQ==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/taquito/node_modules/@taquito/michelson-encoder": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-18.0.0-RC.0.tgz", + "integrity": "sha512-PeXU18uCMWwayfAFe31zhclsZrdW4+f6+PdRi5hsSYWlJ7pEPo2xambKC5gCL8jVTjqcj64BzR5crCH3xsN49Q==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/rpc": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0", + "fast-json-stable-stringify": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/taquito/node_modules/@taquito/rpc": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/rpc/-/rpc-18.0.0-RC.0.tgz", + "integrity": "sha512-JNvWlYHH5/kKaHoYrBmYqRuPafvars97ena1x9y4cksrapg4ZgvkAWudaVfJ9L8ahfY+IoPdmNP3G2FQ3WkeMg==", + "dev": true, + "dependencies": { + "@taquito/core": "^18.0.0-RC.0", + "@taquito/http-utils": "^18.0.0-RC.0", + "@taquito/utils": "^18.0.0-RC.0", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/plugin-taquito/node_modules/@taquito/taquito/node_modules/@taquito/utils": { + "version": "18.0.0-RC.0", + "resolved": "https://registry.npmjs.org/@taquito/utils/-/utils-18.0.0-RC.0.tgz", + "integrity": "sha512-rn/wQ6BHpfMskOp06C4Re2mqMkM1d4PtQlJT602nWNAnpEoEnIWXrJ4Dxsy3xQZxL+Jx1YTtGag9iibYcu89Zw==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@taquito/core": "^18.0.0-RC.0", + "@types/bs58check": "^2.1.0", + "bignumber.js": "^9.1.0", + "blakejs": "^1.2.1", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "elliptic": "^6.5.4", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taqueria/protocol": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@taqueria/protocol/-/protocol-0.44.0.tgz", + "integrity": "sha512-0vZf1n4y0sF60uhba0EXCrlZoUFxj/Ktv0pGTuAtmMPh3iBKLPkvos5bicfbm5e2zMFDnBXsU9kPh3+6I3ru/w==", + "dev": true, + "dependencies": { + "@peculiar/webcrypto": "^1.4.3", + "batching-toposort": "^1.2.0", + "fluture": "^14.0.0", + "i18next": "^23.5.1", + "rambda": "^8.3.0", + "rambdax": "^10.0.0", + "zod": "^3.22.2" + } + }, + "node_modules/@taquito/core": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/core/-/core-17.3.2.tgz", + "integrity": "sha512-prdrB+Cjty+XY2uXbgJXTS5+4+XLLurkchwHFojGLT4y56sHOkSDBSsELwiXvQPf2R6nH24q1v79uSBj+OdvsA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/http-utils": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-17.3.2.tgz", + "integrity": "sha512-jAc1ZRE0zpM7XpIMM90sDWWLq/T3MpB/urxtu9aVnyEM+1n6ERUdK5W3ZA2moMKiHBgLBVHF3EFRdgyoWVEwDg==", + "dev": true, + "dependencies": { + "@taquito/core": "^17.3.2", + "axios": "0.26.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/local-forging": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/local-forging/-/local-forging-17.3.2.tgz", + "integrity": "sha512-xhTXI/Md2kDykGvHE9ktcxsUt0WymCoLuRpfIm0UfWOkINtmUaXvg9Lwka2e92P6HFMq+nHyzIRMfRsu1psI3g==", + "dev": true, + "dependencies": { + "@taquito/core": "^17.3.2", + "@taquito/utils": "^17.3.2", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/michel-codec": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-17.3.2.tgz", + "integrity": "sha512-js/yWXINW5w1WIDgLnTtlXcabtF/N8mt3E+laaHvHSjzxc5BMQXiWcj+vCk0JyHc9Hm/RnVK6AW326R/Bpwj3Q==", + "dev": true, + "dependencies": { + "@taquito/core": "^17.3.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/michelson-encoder": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-17.3.2.tgz", + "integrity": "sha512-EnZ3kKI/SbYyowGuP9JPDr8tRBshMyfaznNXO/LLCagObMfKlmFEr6cOt0dFi5EHcyJB5vEYC5o5dCn056PnGA==", + "dev": true, + "dependencies": { + "@taquito/core": "^17.3.2", + "@taquito/rpc": "^17.3.2", + "@taquito/utils": "^17.3.2", + "bignumber.js": "^9.1.0", + "fast-json-stable-stringify": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/rpc": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/rpc/-/rpc-17.3.2.tgz", + "integrity": "sha512-R2rAvRTA/yiGdP4tl268KbY77WBKIWzNHoOaaLJ8SfWWNdgu+UM6/bemNmr3ZTXnabphgF6sBsCsYbkR2hOW4g==", + "dev": true, + "dependencies": { + "@taquito/core": "^17.3.2", + "@taquito/http-utils": "^17.3.2", + "@taquito/utils": "^17.3.2", + "bignumber.js": "^9.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/signer": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/signer/-/signer-17.3.2.tgz", + "integrity": "sha512-5lFPomhVNgAmNqiTCzCJM6QbPT3XT6HSqcjD3WQx8kM1Xi5P3sLgAMPfucRDVGp2zopZL+MBbt8juIzb7KDy5A==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@stablelib/hmac": "^1.0.1", + "@stablelib/nacl": "^1.0.4", + "@stablelib/pbkdf2": "^1.0.1", + "@stablelib/sha512": "^1.0.1", + "@taquito/core": "^17.3.2", + "@taquito/taquito": "^17.3.2", + "@taquito/utils": "^17.3.2", + "@types/bn.js": "^5.1.1", + "bip39": "3.0.4", + "elliptic": "^6.5.4", + "pbkdf2": "^3.1.2", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/taquito": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/taquito/-/taquito-17.3.2.tgz", + "integrity": "sha512-q9+9i1LwqGl8MpWKzhJVWolnRY3tmYJL7cLfLA0z73X+/tEyZB+Me5VnzIk0rfssAIyXzdQq3KV0FUuprEolyg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@taquito/core": "^17.3.2", + "@taquito/http-utils": "^17.3.2", + "@taquito/local-forging": "^17.3.2", + "@taquito/michel-codec": "^17.3.2", + "@taquito/michelson-encoder": "^17.3.2", + "@taquito/rpc": "^17.3.2", + "@taquito/utils": "^17.3.2", + "bignumber.js": "^9.1.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@taquito/utils": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@taquito/utils/-/utils-17.3.2.tgz", + "integrity": "sha512-0nT6VmgxUcdWRSH1pE5IfLez7HIXuYBniI4IjrzeX6q5Nu1u+tGuivhi3h77DjNg5/cHAPn0g7G59Gm7Biy5AA==", + "dev": true, + "dependencies": { + "@stablelib/blake2b": "^1.0.1", + "@stablelib/ed25519": "^1.0.3", + "@taquito/core": "^17.3.2", + "@types/bs58check": "^2.1.0", + "bignumber.js": "^9.1.0", + "blakejs": "^1.2.1", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "elliptic": "^6.5.4", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-xpXaQlOIY1KoXlA/ytHGHpEIU87PJt+g9SH7nC6HdCgaBwT2IEZIwBMHbjuX6BpnfbiUMlmwqurdLDwXpcdmSA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asn1js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dev": true, + "dependencies": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/axios": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", + "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batching-toposort": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/batching-toposort/-/batching-toposort-1.2.0.tgz", + "integrity": "sha512-HDf0OOv00dqYGm+M5tJ121RTzX0sK9fxzBMKXYsuQrY0pKSOJjc5qa0DUtzvCGkgIVf1YON2G1e/MHEdHXVaRQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dev": true, + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/bip39/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", + "dev": true + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fluture": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/fluture/-/fluture-14.0.0.tgz", + "integrity": "sha512-pENtLF948a8DfduVKugT8edTAbFi4rBS94xjHwzLanQqIu5PYtLGl+xqs6H8TaIRL7z/B0cDpswdINzH/HRUGA==", + "dev": true, + "dependencies": { + "sanctuary-show": "^2.0.0", + "sanctuary-type-identifiers": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/i18next": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.6.0.tgz", + "integrity": "sha512-z0Cxr0MGkt+kli306WS4nNNM++9cgt2b2VCMprY92j+AIab/oclgPxdwtTZVLP1zn5t5uo8M6uLsZmYrcjr3HA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.22.5" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", + "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rambda": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-8.5.0.tgz", + "integrity": "sha512-+bh+mA8Z2iL8fQR8iEvg04bhjlGcFNPaDkI1bDsbp/SQS8Oz29eA5LtdBDdii8tna1SGBMRNkZJ7tNJW/31K4Q==", + "dev": true + }, + "node_modules/rambdax": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rambdax/-/rambdax-10.0.0.tgz", + "integrity": "sha512-yNlWz9g4h6C2+49r1L+L9WZLcw3b3mQnxZQfcyqon8hy52Ie6hsWeuxO9/MNXTbqWB2RuSzO5MM3rVSsPKsqfw==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sanctuary-show": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sanctuary-show/-/sanctuary-show-2.0.0.tgz", + "integrity": "sha512-REj4ZiioUXnDLj6EpJ9HcYDIEGaEexmB9Fg5o6InZR9f0x5PfnnC21QeU9SZ9E7G8zXSZPNjy8VRUK4safbesw==", + "dev": true + }, + "node_modules/sanctuary-type-identifiers": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sanctuary-type-identifiers/-/sanctuary-type-identifiers-3.0.0.tgz", + "integrity": "sha512-YFXYcG0Ura1dSPd/1xLYtE2XAWUEsBHhMTZvYBOvwT8MeFQwdUOCMm2DC+r94z6H93FVq0qxDac8/D7QpJj6Mg==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dev": true, + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dev": true, + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-pattern": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.0.5.tgz", + "integrity": "sha512-tL0w8U/pgaacOmkb9fRlYzWEUDCfVjjv9dD4wHTgZ61MjhuMt46VNWTG747NqW6vRzoWIKABVhFSOJ82FvXrfA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", + "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webcrypto-core": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.7.tgz", + "integrity": "sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==", + "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.1", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wtfnode": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/wtfnode/-/wtfnode-0.9.1.tgz", + "integrity": "sha512-Ip6C2KeQPl/F3aP1EfOnPoQk14Udd9lffpoqWDNH3Xt78svxPbv53ngtmtfI0q2Te3oTq79XKTnRNXVIn/GsPA==", + "dev": true, + "bin": { + "wtfnode": "proxy.js" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/solution_extension/package.json b/solution_extension/package.json new file mode 100644 index 0000000..33da5b4 --- /dev/null +++ b/solution_extension/package.json @@ -0,0 +1,18 @@ +{ + "name": "nft-marketplace", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@taqueria/plugin-contract-types": "^0.44.0", + "@taqueria/plugin-ligo": "^0.44.0", + "@taqueria/plugin-octez-client": "^0.42.0", + "@taqueria/plugin-taquito": "^0.42.0" + } +}